하다가 화가 무지 났네요...ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이진탐색으로 다 구현은 해놨는데, 계속 틀렸습니다 혹은 시간초과가 나서, 뭔지 싶었는데, 결국에는 역시 예외처리를 제대로 못했어요.
예외처리도 정말 실력이랬는데, 아직은 실력이 많이 부족하네요.
그럼 시작해봅시다!!! 화는 블로그에 풉니다. 🔥🔥🔥
저는 이걸 봤을 때 다음과 같이 생각했어요.
- 범위를 보니 이건 꽤나 시간복잡도가 빡세다.
- 결국에 이진탐색으로 푸는 것이 유리하다.
- 이진탐색을 위해 최솟값과 최댓값을 알아보자.
일단 최솟값이 1이다.(문제 명시) 그리고 최댓값은 결국가장 빨리 끝나는 심사대 * n
이다.- 그런데 지금
times
는 정렬이 안됐다. 정렬을 해서, 이를 뽑아낸다.- 이진탐색을 실행한다. 이때 주의할 게 있다. 우리는 그저 딱 맞는! 값이 아니라 걸리는 최솟값을 찾는 거다. (전 이거를 놓쳐서 2시간을 헤맸네요)
- 그러니까, 딱 맞다고 그냥 바로 리턴하는 게 아니라, 계속 이진탐색은 끝까지 하게 두되, 만약 조건을 만족하는 순간이 온다면 그때
mid
를 어떤 변수에 캐싱한다.- 이진탐색이 다 끝났다면 결과를 출력한다.
const solution = (n, times) => {
times.sort((a, b) => a - b);
let [ left, right ] = [ 1, times[0] * n ];
let result = right;
while(left <= right) {
let nowCount = 0;
let mid = Math.floor((left + right) / 2);
times.forEach(time => {
nowCount += Math.floor(mid / time)
if (nowCount >= n) result = Math.min(result, mid);
});
if (nowCount < n) left = mid + 1;
else right = mid - 1;
}
return result;
}
🐶고생하다 눈물날 거 같네오. 맞았어오!
결국에는 문제를 풀었으니, 시간은 이제 중요하지 않네요.
꽤나 과정이 격하긴 했는데, 결국에는 해피엔딩이라, 다음 문제를 풀러...👍 이상!