코딩테스트/Java

[JAVA] 스택/큐 "기능개발"

SK_MOUSE 2020. 9. 5. 21:57

progresses[] 와 speeds[]에 따른 기능 구현.

핵심은, 앞의 기능이 100이 될때까지 뒤에있는 기능들은 배포가 안되고 대기.]

 

필자는 테스트케이스11에서 막혀서 다른 코드를 참고하였다.

 

필자코드

import java.util.Stack;

class Solution {

    public int[] solution(int[] progresses, int[] speeds) {

       Stack<Integer> stack = new Stack<>();

       int check = 0;
       int a=0;
       while(check < progresses.length) {
            int count= 0;
            if(check<progresses.length && progresses[check] > 100 ){
                while(check<progresses.length && progresses[check]> 100){
                    count ++;
                    check++;
                }
                stack.push(count);
                a++;
            }

           //각각 증가
           for (int i = 0; i < progresses.length; i++) {
               progresses[i] += speeds[i]; //각각 속도만큼 증가
           }


       }
       int[] answer = new int[stack.size()];

       int stack_size = stack.size();
       for(int i = 0; i<stack_size; i++){
           answer[(stack_size-1) - i] = stack.pop();
       }

        return answer;
    }

 무엇이 잘못되었는지, 테스트케이스 11이 무엇인지 몰라서 찾지 못하였다.

그리고, 마지막에 answer 값을 가져오는 과정 中, 스택이 아니라 queue를 사용했더라면 FIFO방식이 좀 더 적합했을거라는 아쉬움이 남는다.

 

 

다른 개발자의 코드 중 참고할만한 스트림 풀이

import java.util.ArrayList;
import java.util.Arrays;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] dayOfend = new int[100];
        int day = -1;
        for(int i=0; i<progresses.length; i++) {
            while(progresses[i] + (day*speeds[i]) < 100) {
                day++;
            }
            dayOfend[day]++;
        }
        return Arrays.stream(dayOfend).filter(i -> i!=0).toArray();
    }
}

무척이나 짧기 때문에, 예술적이다.. 문제에 최대 100개의 배열길이 정해져있어서 가능했고, 위에서 그렇게 미리 100개를 선언하기때문에 공간낭비도 있지만 stream의 filter를 이용한다는 점에서 의의가 있다.

 

<위 스트림풀이의 IDEA>

각각의 progresses[i]에 대하여 각 speeds[i]를 통해 며칠이 걸리는지 카운팅한다.

예를들어 progresses[0] 과 progresses[3]이 5일이 걸리면 dayofEnd[5] = 2이다.

 

dayofEnd[걸리는날짜] = 해당하는 progress 카운팅

 

그리고, filter(i-> i!=0) 을 통해서 dayofEnd의 배열값이 0이 아닌것들만 배열로 변환한다.

이때, 문제에서 요구한 "앞에 있는 기능부터 배포"가 당연히 배열의 인덱스값이 작은순서부터 추출되므로

조건에 부합한 출력방식이 된다.

 

Ex)

dayofEnd[5] dayofEnd[10] dayofEnd[20]
2 1 3

이런식으로 카운팅 값이 들어가 있으면

return { 2, 1, 3} 으로 배열이 들어가게 된다.

반응형

'코딩테스트 > Java' 카테고리의 다른 글

[JAVA] 스택/큐 "프린터"  (0) 2020.09.09
[JAVA] 스택/큐 "다리를 지나는 트럭"  (0) 2020.09.07
[JAVA] 스택/큐 "주식가격"  (0) 2020.09.05
[JAVA] 해시 "위장"  (0) 2020.08.31
[JAVA] 해시 "전화번호 목록"  (0) 2020.08.31