본문으로 바로가기

[프로그래머스] 기능 개발

category 코딩 테스트 2022. 3. 17. 20:55

문제

프로그래머스 > 코딩테스트 연습 > 스택/큐 > 기능개발

 

언어

JAVA

 

난이도 

Lv.2

 

풀이시간 

90분

 

문제 풀이

※조건문 표로 정리

마지막 기능일 때 다음 값이 클 때 현재 idx에 값 + 1 후 배포한다.
다음 idx에 값 + 1 후 배포한다.
다음 값이 같거나 작을 때 현재 idx에 값 + 2 후 배포한다.
마지막 기능아닐 때 다음 값이 클 때 현재 idx에 값 + 1 후 배포한다.
배포 idx +1을 한다.
배포 횟수 초기화를 한다.
(이전 날짜=현재 날짜)로 변경한다.
다음 값이 같거나 작을 때 현재 idx에 값 +1만 하고 배포는 하지 않는다.

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package Programmers;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
 
/**
 * 프로그래머스 > 코딩테스트 연습 > 스택/큐 > 기능개발
 *
* @author 
 * @since 2022.03.11 Fri 21:00:00
 * @update 
 */
public class ReleaseDay {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // speeds = [1, 1, 1, 1, 1, 1]
        
        // Case1)
        // 진도율
//        int[] progresses = {93, 30, 55};
        // 작업 속도
//        int[] speeds = {1, 30, 5};
        
        // Case2)
//        int[] progresses = {95, 90, 99, 99, 80, 99};
//        int[] speeds = {1, 1, 1, 1, 1, 1};    
        
        // Case3)
        int[] progresses = {95909999908099};
        int[] speeds = {1111111};
        
        // Case4)
//        int[] progresses = {10, 10, 10};
//        int[] speeds = {1, 1, 1};
        
        // Case5)
//        int[] progresses = {10, 10, 10, 20, 20};
//        int[] speeds = {1, 1, 1, 1, 1};
        
        // 배포 가능 일
        int[] distDate = new int[progresses.length];
        
        for ( int i = 0; i < progresses.length; i++ ) 
        {
            int progress = progresses[i];
            int speed = speeds[i];
            // 배포 가능일 
            int x = 1;
            
            // 진도율 + x * speed >= 100 넘을 때 x가 배포 가능 일
            while(progress + speed * x < 100) {
                x++;
            }
            
            distDate[i] = x;
            
            System.out.println("distDate[i]:"+distDate[i]);
        }
        
        // 이전 배포 작업(미배포 작업 중 작업 기간 가장 긴 것)
        int prevDistDate = 0;
        // 다음 배포 작업
        int nowDistDate = 0;
        // 배포일 리스트 idx
        int answerIdx = 0;
        // 배포 기능 개수 값
        int answerValue = 0;
        
        Map<Integer, Integer> distMap = new TreeMap<Integer, Integer>();
 
        for (int i = 0; i < distDate.length; i++) {
            if(i == 0) {
                // 다음 배열부터 비교 위해 i = 0 일때 prev값 넣어준다.
                prevDistDate = distDate[i];                
            } else {
                nowDistDate = distDate[i];
                
                if ( i == distDate.length - 1 ) 
                {
                    // 마지막 기능에 대한 처리
                    if ( prevDistDate < nowDistDate )
                    {
                        System.out.println("마지막o: 다음 작업이 클때");
                        // 다음 작업이 클 때 => 다음 idx +1 한 후 배포
                        // 이전 작업에 대한 배포
                        answerValue++;
                        distMap.put(answerIdx, answerValue);
 
                        // 다음 작업(마지막)에 대한 배포
                        // 0으로 초기화 하고 +1한 것 아래 소스 한줄로 축약.
                        answerValue = 1;
                        answerIdx++;
                        distMap.put(answerIdx, answerValue);
                        // 마지막 기능에 대한 처리이므로 처리 후 break;
                        break;
                    }
                    else if( prevDistDate >= nowDistDate ) 
                    {
                        System.out.println("마지막o: 다음 작업이 작거나 같을 때");
                        // 다음 작업이 작거나 같을 때 => 현재 idx +1 한 후 배포
                        // 이전 작업에 대한 배포
                        answerValue++;
                        // 마지막 작업에 대한 배포 (이전 작업에 포함되어 배포되므로 idx변경 없음)
                        answerValue++;
                        distMap.put(answerIdx, answerValue);
                        // 마지막 기능에 대한 처리이므로 처리 후 break;
                        break;
                    }
                }
                else 
                {
                    if ( prevDistDate < nowDistDate )
                    {
                        System.out.println("마지막x: 다음 작업이 클 때");
                        /*
                         * 다음 작업이 클 때 => 이전 작업 배포
                         * 배포 작업 수 +1
                         */            
                        answerValue++;
                        distMap.put(answerIdx, answerValue);
                        // 배포 완료했으므로 다음 배포는 idx + 1
                        answerIdx++;
                        // 이전 작업은 배포 완료했으므로 새로운 배포 작업으로 비교 시작
                        prevDistDate = nowDistDate;
                        // 배포 완료했으므로 배포 기능 개수 초기화
                        answerValue = 0;
                    }
                    else if( prevDistDate >= nowDistDate ) 
                    { 
                        System.out.println("마지막x: 다음 작업이 작거나 같을 때");
                        /*
                         * 다음 작업이 작거나 같을 때 => 미배포 
                         * 배포 작업 수만 +1
                         * 아직 배포 안 했으므로 answerIdx(배포 리스트 idx)는 그대로이다.
                         */
                        answerValue++;
                    }
                }
            }
        }
        
        int answer[] = new int[distMap.size()];
        
        for (int j = 0; j < distMap.size(); j++) {
            answer[j] = distMap.get(j);
            System.out.println("answer[j]:"+answer[j]);
        }
        
        
    }
 
}
 
cs
 

후기

다른 사람 풀이를 보니 내 코드는 비효율적인 것을 알았다.

스택/큐의 문제라고 말해줘도 굳이 Map을 써서 푼 나를 어찌할꼬..

Queue의 offer로 담고 clear로 배포하면 쉽게 해결 할 수 있었다.

다음엔 Queue를 사용해서 풀어보자.

 

필기 내용

 

출처

프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/42586