https://school.programmers.co.kr/learn/courses/30/lessons/42586
문제를 처음에 보면 이해가 잘 안가고, 예시와 풀이를 함께 봐야 이해가 좀 더 잘가는 것 같다. 문제 이해를 정확히 해야 풀이를 잘 할 수 있다는 것을 명심하자.
Queue를 이용한 풀이. 처음부터 카운트 하려하지 말고 뒤에 큰 숫자가 나왔을때 이전까지의 카운트를 answer에 넣어주는 식으로 진행해야한다.
ex) 7 3 9
- 처음에 7은 무조건 배포하지 못한다. (count = 1)
- 3은 7보다 작으니 대기. (count = 2)
- 9는 7보다 크니까 이전 count (count = 2)를 answer에 찍어주고, 다시 한계점을 9로 설정하고 count를 다시 시작한다.
- Math.ceil
해당 문제에서는 7 / 3 = 2.XXX인데 올림해서 3을 계산해줘야한다.
정확한 올림 계산을 위해서는 double로 형을 변환해줘야한다.int expiration = (int) Math.ceil((double)(100 - progresses[index]) / speeds[index]);
- ArrayList Integer to int배열
나의 velog 기초 정리 참고return answer.stream().mapToInt(Integer::intValue).toArray();
- day = expiration 을 해주는 시점이 처음 값으로 수정해줘야하기 때문에 if(expiration > day) 를 지나고 선언해줘야한다.
if(day != 0){ // 첫 완성은 배포할 수 없다. answer.add(count); //day = expiration; count = 0; } day = expiration;
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
ArrayList<Integer> answer = new ArrayList<>();
Queue<Integer> q = new LinkedList<>();
// 1. Queue에 집어넣기.
for(int i = 0; i < progresses.length; i++){
q.add(i);
}
int day = 0;
int count = 0;
while(!q.isEmpty()){
int index = q.poll();
int expiration = (int) Math.ceil((double)(100 - progresses[index]) / speeds[index]);
if(expiration > day){
if(day != 0){ // 첫 완성은 배포할 수 없다.
answer.add(count);
//day = expiration;
count = 0;
}
day = expiration;
}
count++;
}
answer.add(count);
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int n = progresses.length;
int[] arr = new int[n];
for(int i = 0; i < n; i++){
int work = (100 - progresses[i]) / speeds[i];
if( (100 - progresses[i]) % speeds[i] == 0 ){
arr[i] = work;
} else{
arr[i] = work + 1;
}
}
int befWork = arr[0];
ArrayList<Integer> list = new ArrayList<>();
int count = 1;
for(int i = 1; i < n; i++){
if(befWork < arr[i]){
list.add(count);
count = 1;
befWork = arr[i];
} else{
count++;
}
}
list.add(count);
return list.stream().mapToInt(Integer::intValue).toArray();
}
}