빈자리 없이 이어진 좌석인지 확인하기

자바스크립트 코딩테스트 문제로 range-validation 주제를 연습해보세요. 난이도는 easy이며, 브라우저에서 바로 JavaScript로 풀이를 실행할 수 있습니다.

today easy range-validation 함수명: solution 제한 시간: 200ms

문제 설명

좌석 번호가 담긴 배열 seats가 주어질 때, 이 좌석들이 중복 없이 하나의 연속된 구간을 정확히 이루면 true, 아니면 false를 반환하는 solution 함수를 작성하세요.

예를 들어 [7, 9, 8, 10]은 정렬하면 7, 8, 9, 10이므로 빈자리 없이 이어진 좌석입니다. 반면 [4, 6, 7]5가 비어 있으므로 연속된 구간이 아닙니다.

제한사항

  • seats의 길이는 1 이상 100,000 이하입니다.
  • 각 좌석 번호는 1 이상 1,000,000,000 이하의 정수입니다.
  • 좌석 번호의 입력 순서는 정렬되어 있지 않을 수 있습니다.
  • 같은 좌석 번호가 여러 번 들어오면 연속 구간으로 보지 않습니다.

예시

  • 입력: [12, 13, 14, 15] → 출력: true
  • 입력: [7, 9, 8, 10] → 출력: true
  • 입력: [4, 6, 7] → 출력: false
  • 입력: [5, 5, 6] → 출력: false

힌트

  • 정렬해서 직접 확인할 수도 있지만, 꼭 모든 값을 정렬할 필요는 없습니다.
  • 연속된 정수 n개가 있다면 최댓값 - 최솟값은 항상 n - 1입니다.
  • 다만 같은 숫자가 중복되면 이 조건만으로는 부족하니, 중복 여부도 함께 확인해야 합니다.

해설

이 문제의 핵심은 연속된 정수 구간의 길이 관계를 이용하는 것입니다.

좌석이 중복 없이 연속되어 있다면:

  • 가장 작은 값이 min
  • 가장 큰 값이 max
  • 좌석 개수가 n

일 때 반드시 아래가 성립합니다.

  • max - min === n - 1

예를 들어 [7, 9, 8, 10]은:

  • min = 7
  • max = 10
  • n = 4
  • 10 - 7 = 3, 그리고 n - 1 = 3

이므로 연속 구간일 가능성이 있습니다.

하지만 이것만으로는 충분하지 않습니다. 예를 들어 [5, 5, 6]은:

  • min = 5
  • max = 6
  • n = 3
  • 6 - 5 = 1

이라서 얼핏 맞아 보이지 않지만, 실제로는 5가 중복이라 7이 빠져 있습니다. 그래서 중복을 제거한 Set의 크기가 원래 길이와 같은지도 확인해야 합니다.

정리하면 풀이 순서는 다음과 같습니다.

  1. Set으로 중복이 있는지 확인합니다.
  2. 배열을 한 번 순회하며 최솟값과 최댓값을 구합니다.
  3. max - min === seats.length - 1인지 확인합니다.
  4. 중복이 없고 길이 관계도 맞으면 true, 아니면 false를 반환합니다.

이 방식은 정렬 없이 한 번의 순회와 Set만으로 해결할 수 있어 효율적입니다.

코드 작성

starter code를 바탕으로 함수를 완성한 뒤 예제 테스트를 실행해보세요.

JavaScript 에디터 로딩 중...

커스텀 테스트

함수 인자를 JSON 배열 형태로 입력하세요. 예: [3, 5], [[1, 2, 3]]

아직 실행하지 않았습니다.

실행 결과

아직 실행하지 않았습니다.

예제 테스트를 실행하면 여기에서 결과를 확인할 수 있습니다.

댓글

문제 풀이 아이디어, 질문, 반례를 자유롭게 나눠보세요.