[boj] 1253. 좋다 (node.js)

호이·2022년 2월 12일
0

algorithm

목록 보기
21/77
post-thumbnail

문제 요약

[boj] 1253. 좋다 (node.js)

  • 입력: N개의 숫자들
  • 출력: 좋은 수의 개수
  • 어떤 수를 다른 두 수의 합으로 나타낼 수 있는 경우 "좋다" 라고 한다.
  • 중복되는 숫자이더라도 위치가 다른 경우 다른 수이다.

풀이

  • 좋은 수를 탐색하기 위해 투 포인터를 활용한다.
    • (최대 + 최소 < 원하는 수) 인 경우는 기존 최소를 삭제한다.
    • (최대 + 최소 > 원하는 수) 인 경우는 기존 최대를 삭제한다.
    • 이렇게 L, R을 한 칸씩 움직이며 탐색하고,
    • 조건을 만족하는 경우 바로 return 해준다.
  • 알고리즘 내부에서 어떤 수를 활용해 그 수를 만들지 않도록 구현한다.
    • 이때 값이 같아도 위치가 다른 수이면 다른 수이므로 index를 활용한다.

내 풀이

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 = input()
  const arr = input().split(" ").map(Number)
  arr.sort((a, b) => a - b)
  let count = 0
  for (let i = 0; i < N; i++) {
    if (goodNum(i, 0, N - 1)) count++
  }
  console.log(count)
  process.exit()

  function goodNum(idx, L, R) {
    let sum = 0
    while (L < R) {
      if (L == idx) L++
      if (R == idx) R--
      if (L >= R) return false
      sum = arr[L] + arr[R]
      if (sum == arr[idx]) return true
      if (sum < arr[idx]) {
        L++
      } else {
        R--
      }
    }
    return false
  }
})
profile
매일 부활하는 개복치

0개의 댓글