빈자리 없이 이어진 좌석인지 확인하기
자바스크립트 코딩테스트 문제로 range-validation 주제를 연습해보세요. 난이도는 easy이며, 브라우저에서 바로 JavaScript로 풀이를 실행할 수 있습니다.
문제 설명
좌석 번호가 담긴 배열 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 = 7max = 10n = 410 - 7 = 3, 그리고n - 1 = 3
이므로 연속 구간일 가능성이 있습니다.
하지만 이것만으로는 충분하지 않습니다.
예를 들어 [5, 5, 6]은:
min = 5max = 6n = 36 - 5 = 1
이라서 얼핏 맞아 보이지 않지만, 실제로는 5가 중복이라 7이 빠져 있습니다. 그래서 중복을 제거한 Set의 크기가 원래 길이와 같은지도 확인해야 합니다.
정리하면 풀이 순서는 다음과 같습니다.
Set으로 중복이 있는지 확인합니다.- 배열을 한 번 순회하며 최솟값과 최댓값을 구합니다.
max - min === seats.length - 1인지 확인합니다.- 중복이 없고 길이 관계도 맞으면
true, 아니면false를 반환합니다.
이 방식은 정렬 없이 한 번의 순회와 Set만으로 해결할 수 있어 효율적입니다.
코드 작성
starter code를 바탕으로 함수를 완성한 뒤 예제 테스트를 실행해보세요.
JavaScript
에디터 로딩 중...
커스텀 테스트
함수 인자를 JSON 배열 형태로 입력하세요. 예: [3, 5], [[1, 2, 3]]
아직 실행하지 않았습니다.
실행 결과
아직 실행하지 않았습니다.
예제 테스트를 실행하면 여기에서 결과를 확인할 수 있습니다.
댓글
문제 풀이 아이디어, 질문, 반례를 자유롭게 나눠보세요.