알고리즘
[알고리즘 / 프로그래머스] 기능개발
DevBee
2020. 12. 3. 21:40
programmers.co.kr/learn/courses/30/lessons/42586
코딩테스트 연습 - 기능개발
프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는
programmers.co.kr
문제는 위와 같으며 주어진 작업의 수만큼 for 문을 돌면서 작업을 완료하는데 걸리는 일 수를 구한 뒤 큐에 저장합니다. 이때 큐의 가장 앞에 있는 값과 현재 값을 비교해서 더 작은 경우에만 큐의 마지막에 값을 추가하고 현재 값이 더 큰 경우에는 큐에 있는 값을 모두 빼면서 개수를 세고 해당 개수를 결과 배열에 저장하면 문제를 해결할 수 있습니다.
파이썬 코드는 다음과 같습니다.
def solution(progresses, speeds):
queue = []
answer = []
for i in range(len(progresses)):
wd = wd = (100 - progresses[i]) // speeds[i] # 작업 완료 일 구하기
if (100 - progresses[i]) % speeds[i] != 0:
wd += 1
if len(queue) == 0 or queue[0] >= wd: # 큐의 가장 앞에 있는 작업 완료 일과 비교하여 작은 경우에만 큐에 저장
queue.append(wd)
else:
count = 0
while queue: # 큐에 값이 없을 때까지 pop 하고 그 수를 계산
queue.pop(0)
count += 1
answer.append(count) # 결과 배열에 지금까지 큐에 있던 값의 수를 저장
queue.append(wd) # 현재 작업의 완료일을 다시 큐에 저장
if len(queue) != 0: # 큐에 값이 남아있는 경우 값을 모두 제거하고 그 개수를 계산해 결과 배열에 저장
count = 0
while queue:
queue.pop(0)
count += 1
answer.append(count)
return answer
자바 코드는 다음과 같습니다.
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Queue<Integer> queue = new ArrayDeque<>();
ArrayList<Integer> result = new ArrayList<>();
for (int i = 0; i < progresses.length; i++) {
int wd = (100 - progresses[i]) / speeds[i];
if ((100 - progresses[i]) % speeds[i] != 0) {
wd += 1;
}
if (queue.isEmpty() || queue.peek() >= wd) {
queue.add(wd);
} else {
int count = 0;
while (!queue.isEmpty()) {
queue.poll();
count++;
}
result.add(count);
queue.add(wd);
}
}
if (!queue.isEmpty()) {
int count = 0;
while (!queue.isEmpty()) {
queue.poll();
count++;
}
result.add(count);
}
int[] answer = result.stream().mapToInt(i -> i).toArray();
return answer;
}
}