public static int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
int max_progress = 100;
Queue<Integer> q = new LinkedList<>();
for(int i=0; i< progresses.length; i++) {
int open_days = (max_progress-progresses[i])/speeds[i];
if((max_progress-progresses[i])%speeds[i]>0) open_days++;
q.offer(open_days);
}
HashMap<Integer, Integer> hm = new HashMap<>();
// 처음 오픈해야 하는 날짜 (poll로 빼줌)
int days = q.poll();
int d = 1;
// 첫번째 기능 오픈
hm.put(d, 1);
while (!q.isEmpty()) {
//System.out.println(days+" "+q.peek());
if(days >= q.peek()) {
hm.put(d, hm.getOrDefault(d, 0)+1);
//System.out.println(">> "+d+" "+hm.get(d));
q.poll();
} else {
d++;
days = q.poll();
hm.put(d, 1);
}
}
System.out.println("====");
answer = new int[hm.size()];
for (Integer dd : hm.keySet()) {
System.out.println(dd + " " + hm.get(dd));
answer[dd-1] = hm.get(dd);
}
return answer;
}
큐와 해시맵을 이용해서 통과!
첫번째 기능 오픈 날짜를 기준일자로 잡고 해시맵에 맨 처음 담은 후, 그 일자보다 이후일 때마다 기준일자를 갱신하고 해시맵에 새로 담았다. 큐가 비워질 때까지 반복문을 돌려 peek으로 비교할 날짜를 꺼내와서 오픈이 된 기능의 날짜들은 poll로 빼줬다.
Queue의 주요 기능
값 추가
add
offer
값 삭제
remove 해당 값을 비움
poll 맨 앞에 있는 값을 꺼내고 비움
clear 아예 큐를 비움
값 확인
poll 맨 앞에 있는 값을 꺼내고 비움
peek 맨 앞에 있는 값 출력
다른 사람 풀이 볼때마다 어떻게 이렇게 짤 수 있나 놀라우면서도 자괴감이 들면서도 ... 갈 길이 멀었다 !!!