자료구조&알고리즘/프로그래머스
프로그래머스 - 기능개발 (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;
}
}