문제출처
https://programmers.co.kr/learn/courses/30/lessons/42586
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> answer_list = new ArrayList<>();
int idx = 0;
while(idx < progresses.length){
int count = 1;
int day = (100 - progresses[idx]) / speeds[idx];
if((100 - progresses[idx]) % speeds[idx++] != 0) {
day++;
}
while(idx < progresses.length && 100 - progresses[idx] <= speeds[idx] * day){
count++;
idx++;
}
answer_list.add(count);
}
return answer_list.stream().mapToInt(i->i).toArray();
}
}
문제에는 스택/큐라고 써있긴한데 스택이나 큐를 사용하진 않았다...
접근방법
idx로 현재 접근한 progress를 우선 확인 후 이걸 완료하는데에 필요한 day를 구한다.
다음 progress를 접근해 day내에 다음 작업들을 처리 할 수 있는지 확인 후 카운트해준다.
접근 자체는 처음에 바로 떠올렸는데 테스트 케이스 1, 2, 4, 5였나 아무튼 4개정도 틀렸다.
결국 질문게시판 뒤지기 찬스
반례로
progresses: [96, 99, 98, 97]
speeds: [1,1,1,1]
answer: [4]
를 추가하라고 했다.
이 반례로 고친 부분은 while문 안의 while문에서 100 - progresses[idx] <= speeds[idx] * day이 부분의 부등호를 내가 처음에는 <라고 했었다. 일치하는 경우도 생기기 때문에 =를 추가해주니
1,5는 맞았다.
2, 4의 문제는 처음 day를 구하는 부분이었다.
내가 처음에 작성한 코드에서 day는
double day = Math.ceil((100 - progresses[idx]) / speeds[idx++]);
이렇게 구했었다.
질문게시판에서 찾은 반례는 아니고 내가 새롭게 추가한 테스트 케이스는
progresses: [93, 30, 55]
speeds: [6, 50, 50]
answer: [3]
이것.
progress가 speed로 완벽하게 나누어 떨어지지 않는 경우에 그냥 올림을 해주면 되지 않을까? 단순하게 생각했는데
위 반례의 경우에 93일때 내 예상으로는 day에 2.0이 들어가야하는데 1.0이 들어가는 일이 생기고 있었다.
내 예상으로는 progresses와 speeds가 모두 int형이기 때문에 (100 - progresses[idx]) / speeds[idx++]의 결과가 그냥 1으로 나오는 상태에서 ceil을 해주니 1.0이 된것 같다.
저 방법대로 하려면 ceil안 부분을 double로 변환을 해주든지 해야할듯
아무튼 day를 int형으로 바꾸고 ceil을 사용하지 않는 쪽으로 고쳐주었다.
'문제풀이 > 코딩테스트' 카테고리의 다른 글
백준 10986번 : 나머지 합 [Java] (0) | 2024.01.22 |
---|---|
백준 1520번 : 내리막 길[Java] (0) | 2024.01.19 |
프로그래머스 멀쩡한 사각형 [Java] (0) | 2022.05.05 |
프로그래머스 오픈채팅방 [Java] (0) | 2022.05.05 |
프로그래머스 124 나라의 숫자 [Java] (0) | 2022.05.05 |