기능개발 (자바)

김재현·2023년 12월 25일
0

알고리즘 풀이

목록 보기
66/89

문제

정답 코드

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] temp = new int[100];  // 모두 0으로 초기화 되어 있음.

        // 작업 진행 상황을 모두 배열로(0 포함)
        for (int i=0;i<100;i++) {
            int index=0;
            int endIndex=0;

            // 진도를 모두 올림
            for (int j=0;j< progresses.length;j++) {
                progresses[j]+=speeds[j];
            }

            // 올라간 진도를 비교해서...
            for (int j=0;j< progresses.length;j++) {
          		//20000: 최대값. 진도율 100이던 작업이 속도 100으로 100일 달리면 20000이 최대임
                if (progresses[j] >= 100 && progresses[j] <= 20000) {  
                    index++;
                    endIndex++;
                    progresses[j] = 30000; // if문을 벗어나게 아예 크게 설정
                } else if (progresses[j]<100) {
                    temp[i]=index;
                    break;
                } else {
                    endIndex++;
                }
                
                if (endIndex== progresses.length) { // 모두 100 넘게 달성했을 경우
                    temp[i]=index;
                }
            }
        }

        // temp에서 0 제거
        List<Integer> list = new ArrayList<>();
        Arrays.stream(temp).forEach(a -> {
            if (a!=0) {
                list.add(a);
            }
        });

        int[] answer = list.stream().mapToInt(Integer::intValue).toArray();

        return answer;
    }
}

어려운 문제는 아니었지만, 효율적으로 풀었다고 생각이 되진 않는다.

다른 사람 풀이

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();
    }
}

일단 return 부분에서 0을 제외시키는게 굉장히 깔끔하다!
stream의 filter를 사용한다는 것이 항상 잊어버리는... 하하 꼭 써먹어봐야지싶다.

그리고 day라는 변수를 1씩 증가시키며, 그것으로 dayOfend 배열의 일자에 완료된 작업의 개수를 추가한다는 것 풀이를 생각할 수 있다니!
데이터 낭비도 심하지 않고 속도도 빠르다.

이런식으로 좀 더 효율적인 풀이를 고민해야겠다.

profile
I live in Seoul, Korea, Handsome

0개의 댓글