[프로그래머스] 입국심사 (자바스크립트, JavaScript)

young_pallete·2021년 8월 5일
1

Algorithm

목록 보기
13/32

시작하며 🚑

하다가 화가 무지 났네요...ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이진탐색으로 다 구현은 해놨는데, 계속 틀렸습니다 혹은 시간초과가 나서, 뭔지 싶었는데, 결국에는 역시 예외처리를 제대로 못했어요.

예외처리도 정말 실력이랬는데, 아직은 실력이 많이 부족하네요.
그럼 시작해봅시다!!! 화는 블로그에 풉니다. 🔥🔥🔥

풀이과정 📃

저는 이걸 봤을 때 다음과 같이 생각했어요.

  1. 범위를 보니 이건 꽤나 시간복잡도가 빡세다.
  2. 결국에 이진탐색으로 푸는 것이 유리하다.
  3. 이진탐색을 위해 최솟값과 최댓값을 알아보자.
    일단 최솟값이 1이다.(문제 명시) 그리고 최댓값은 결국 가장 빨리 끝나는 심사대 * n 이다.
  4. 그런데 지금 times는 정렬이 안됐다. 정렬을 해서, 이를 뽑아낸다.
  5. 이진탐색을 실행한다. 이때 주의할 게 있다. 우리는 그저 딱 맞는! 값이 아니라 걸리는 최솟값을 찾는 거다. (전 이거를 놓쳐서 2시간을 헤맸네요)
  6. 그러니까, 딱 맞다고 그냥 바로 리턴하는 게 아니라, 계속 이진탐색은 끝까지 하게 두되, 만약 조건을 만족하는 순간이 온다면 그때 mid를 어떤 변수에 캐싱한다.
  7. 이진탐색이 다 끝났다면 결과를 출력한다.

코드

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;
}

🐶고생하다 눈물날 거 같네오. 맞았어오!

마치며 🌻

결국에는 문제를 풀었으니, 시간은 이제 중요하지 않네요.
꽤나 과정이 격하긴 했는데, 결국에는 해피엔딩이라, 다음 문제를 풀러...👍 이상!

profile
People are scared of falling to the bottom but born from there. What they've lost is nth. 😉

0개의 댓글