[백준] 1059 좋은 구간 JavaScript

·2024년 11월 6일

문제

정수 집합 S가 주어졌을때, 다음 조건을 만족하는 구간 [A, B]를 좋은 구간이라고 한다.

A와 B는 양의 정수이고, A < B를 만족한다.
A ≤ x ≤ B를 만족하는 모든 정수 x가 집합 S에 속하지 않는다.
집합 S와 n이 주어졌을 때, n을 포함하는 좋은 구간의 개수를 구해보자.

1 ≤ L ≤ 50
집합 S에는 중복되는 정수가 없다.
집합 S에 포함된 모든 정수는 1보다 크거나 같고, 1,000보다 작거나 같다.
1 ≤ n ≤ (집합 S에서 가장 큰 정수)

입력

첫째 줄에 집합 S의 크기 L이 주어진다. 둘째 줄에는 집합에 포함된 정수가 주어진다. 셋째 줄에는 n이 주어진다.

출력

첫째 줄에 n을 포함하는 좋은 구간의 개수를 출력한다.

예제 입력

4
1 7 14 10
2

예제 출력

4

내가 했던 풀이 방법

  1. num을 정렬해주고 맨 앞에 0을 넣어준다. 0을 넣어주는 이유는 n이 입력받은 num들보다 작을 때를 고려해주어야 하기 때문이다.
  2. num을 순차적으로 돌면서 num[i]가 n보다 작거나 같고 n보다 num[i+1]이 크거나 같을 때 3번 연산을 진행한다.
  3. j를 num[i]+1로 두고 num[i+1] 전까지를 두고, k를 j+1부터 num[i+1] 전까지로 둔다. [j, k]는 A<B를 만족하면서 모든 정수 x가 집합 S에 속하지 않은 상태이다. 이제 다시 한 번 j가 n보다 작거나 같고 k가 n보다 크거나 같을 경우 answer에 [j, k]를 저장해준다.
  4. 2-3번 연산이 끝난 뒤에 answer에 들어있는 [j, k]의 개수가 문제에서 구하고자 하는 좋은 구간의 개수가 될 것이다.

코드

const fs = require('fs');
let [L, num, n] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

L = Number(L);
num = num.trim().split(' ').map(Number);
n = Number(n);

num.sort((a, b) => a - b);
num.unshift(0);
let answer = [];

for (let i = 0; i < L; i++) {
  if (num[i] <= n && n <= num[i + 1]) {
    for (let j = num[i] + 1; j < num[i + 1]; j++) {
      for (let k = j + 1; k < num[i + 1]; k++) {
        if (j <= n && n <= k) {
          answer.push([j, k]);
        }
      }
    }
  }
}

console.log(answer.length);

회고

잔실수만 고치면 원트에도 깰 수 있는 문제였는데... 아쉬운 문제

profile
Frontend🍓

0개의 댓글