자료구조&알고리즘/프로그래머스

프로그래머스 - 기능개발 (JAVA)

yong_ღ'ᴗ'ღ 2023. 9. 16. 03:09

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

접근 방식) 

1) progresses[]에 있는 작업들의 작업완료일을 계산해서 Queue에 추가한다.

    작업완료일 = 100 - progresses[i] / speeds[i];

    → 나누어 떨어지지 않으면 + 1 해준다.

2) Queue가 빌 때까지 반복하며, Queue의 첫번째원소(prev)와 현재원소(now)를 비교한다.

    - prev보다 now가 작거나 같다면, list에 추가되어있는 배포개수를 + 1 로 list.set() 해준다.

    - prev보다 now가 크다면, 이전 배포까지는 작업이 완료되지 못했다는 의미이다.

      → 다음 배포 때 배포되게 개수 새로 추가 → list.add(1); 

3) list에 저장된 값을 answer[] 배열에 옮긴 후, return

 

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        /*
        완료일 구해서 queue에 추가해줌
            완료일 = 100 - progresses[i] / speeds[i]
            if ((100 - grogresses[i]) % speeds[i] > 0) 완료일++;
            
        queue에 있는 모든 원소 살펴보면서, list에 배포개수 추가 및 설정 작업
        이전 원소보다 완료일수 적으면, list에 추가한 배포개수++로 set;
                             크면, list에 배포개수 새로 add & prev 업데이트
        */
        
        Queue<Integer> queue = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        
        for (int i = 0; i < progresses.length; i++) {
            int remainder = 100 - progresses[i];
            int completeDay = remainder / speeds[i];
            if (remainder % speeds[i] > 0)
                completeDay++;
            
            queue.add(completeDay);
        }
        
        int prev = queue.poll();
        list.add(1);    // 리스트에 일단 개수 한 개 추가
        while (!queue.isEmpty()) {
            int now = queue.poll();
            if (now <= prev) {
                int endIdx = list.size() - 1;
                list.set(endIdx, list.get(endIdx) + 1);
            } else {
                prev = now;
                list.add(1);
            }
        }
        
        int[] answer = new int[list.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}