[boj] 2110. 공유기 설치 (node.js)

호이·2022년 2월 11일
0

algorithm

목록 보기
20/77
post-thumbnail

문제 요약

[boj] 2110. 공유기 설치 (node.js)

풀이

  • 문제 조건을 함수로 작성한 후, 이분탐색 알고리즘의 결정 조건으로 활용하는 문제다.
  • 결정 조건
    • 주어진 공유기의 설치 가능 위치가 한 집당 최대 하나이므로, 멀리 두기 위해서는 무조건 정렬 완료된 첫 집에는 설치되어야 한다.
    • 따라서 첫 번째 집부터 시작하여 마지막 설치 장소를 담은 변수를 활용하여, 마지막 설치 장소와 그 다음 설치 장소 간 거리를 주어진 거리 이상으로 할 때만 설치가 가능하다.
    • 총 설치 대수를 센 후, 문제에서 제시된 개수보다 크거나 같을 때 true를 반환한다.
  • 이분 탐색에서는 결정 조건을 만족하는 마지막 값이 result 변수에 들어있도록 코딩하였다.

내 풀이

const readline = require("readline")
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
})

let cnt = 0
const input = () => stdin[cnt++]

let stdin = []
rl.on("line", function (line) {
  stdin.push(line)
}).on("close", function () {
  const [N, C] = input().split(" ").map(Number)
  let arr = []
  for (let i = 0; i < N; i++) arr.push(Number(input()))
  arr.sort((a, b) => a - b)
  console.log(binarySearch(0, 1000000000))
  process.exit()

  function binarySearch(L, R) {
    let result = arr[L]
    while (L <= R) {
      let mid = Math.trunc((L + R) / 2)
      if (isAvailable(mid)) {
        result = mid
        L = mid + 1
      } else {
        R = mid - 1
      }
    }
    return result
  }

  function isAvailable(dist) {
    let count = 1
    let last = arr[0]
    for (let i = 1; i < N; i++) {
      if (arr[i] - last < dist) continue
      last = arr[i]
      count++
    }
    return count >= C
  }
})

오늘의 느낀 점

  • 이분 탐색 알고리즘에 조건을 넣을 때는 true를 만들 기준을 명확히 세우고 코딩을 시작해야 시간낭비를 줄일 수 있다.
profile
매일 부활하는 개복치

0개의 댓글