레벨 2
https://programmers.co.kr/learn/courses/30/lessons/42586
처음 이 문제를 풀었을 때 배열로 문제를 해결했는데 다시 풀다보니 큐로도 해결할 수 있어서 두가지 모두 풀이하겠다. (크게 다른 점은 없다.)
문제 풀이 순서
방법 1) 배열로 푸는 방법
1. 작업일 수 배열(works)을 구한다.
2. works를 for문을 돌린다.
3. 전에 나온게(x) 나중에 나온 것(works[i])보다 크거나 같으면 count를 증가,
아니면 count를 list에 추가, count를 1로 초기화, x=works[i] 처리
4. for문을 빠져나와서 마지막 처리 count를 리스트에 추가한다.
5. list를 출력한다.
방법 2) 큐로 푸는 방법
1. 작업일 수를 큐에 저장한다.
2. 큐가 빌 때까지 작업을 실행한다.
3. 전에 나온게(x) 나중에 나온 것(q.peek()) 보다 크거나 같으면 count 증가, q.poll(),
아니면 count를 리스트에 추가, count를 1로 초기화, x=q.poll()처리
4. while문을 빠져나와서 마지막 처리 count를 리스트에 추가한다.
5. list를 출력한다.
방법 1) 배열로 푸는 방법
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> list = new ArrayList<>();
int[] works = new int[progresses.length];
for(int i = 0; i < speeds.length; i++){
works[i] = (100 - progresses[i]) / speeds[i];
if ((100 - progresses[i]) % speeds[i] != 0){
works[i] += 1;
}
}
int x = works[0];
int count=1;
for(int i=1;i<progresses.length;i++){
if(x>=works[i]){
count+=1;
}else{
list.add(count);
count =1;
x= works[i];
}
}
list.add(count);
int[] answer = new int[list.size()];
for (int i = 0; i <list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
방법 2) 큐로 푸는 방법
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> list = new ArrayList<>();
Queue<Integer> q = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
if ((100 - progresses[i]) % speeds[i] == 0) {
q.add((100 - progresses[i]) / speeds[i]);
} else {
q.add((100 - progresses[i]) / speeds[i] + 1);
}
}
int x = q.poll();
int count = 1;
while (!q.isEmpty()) {
if (x >= q.peek()) {
count++;
q.poll();
} else {
list.add(count);
count = 1;
x = q.poll();
}
}
list.add(count);
int[] answer = new int[list.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = list.get(i);
}
return answer;
}
}