{}연습장
대시보드학습스킬 경로문제모의고사라이브 코테복습데이터
문제 목록〉그리디〉스터디룸 예약 승인← 이전다음 →
#072 · 그리디쉬움그리디 + 정렬

스터디룸 예약 승인

문제

도서관 스터디룸 한 곳에 하루치 예약 신청이 밀려 있습니다. 신청 목록 requests 의 각 원소는 [시작, 종료] 이며, 개관 시각으로부터 몇 분 뒤인지를 나타냅니다.

스터디룸은 한 팀이 쓰고 나가면 정리·환기 시간 gap 분이 필요합니다. 즉 어떤 예약을 종료 분에 끝냈다면, 다음 예약은 종료 + gap 분 이후(같은 시각 포함)에 시작해야 승인할 수 있습니다.

관리자는 승인하는 예약의 개수를 최대로 만들고 싶습니다. 승인할 수 있는 예약의 최대 개수를 반환하세요. (예약 시간의 길이는 고려하지 않습니다.)

solution(requests: number[][], gap: number): number

예시

requests gap 반환값
[[0,60],[30,90],[60,120],[75,135],[130,180],[150,210],[200,240]] 10 3
[[0,45],[45,90],[90,135],[135,180]] 0 4
[[0,240],[20,50],[60,110]] 5 2
[[0,20],[25,45],[50,70]] 30 2

첫 번째 예시에서 승인되는 조합 중 하나는 [0,60], [75,135], [150,210] 입니다. [0,60] 이 끝난 뒤 정리 시간 10분이 필요하므로 다음 예약은 70분 이후에 시작해야 하고, 같은 이유로 [130,180] 은 [75,135] 뒤에 이어서 쓸 수 없습니다.

네 번째 예시는 정리 시간이 30분이나 되어, 붙어 있는 세 예약 중 두 개까지만 승인됩니다.

제약 조건

  • 1 ≤ requests.length ≤ 200,000
  • 0 ≤ 시작 < 종료 ≤ 1,000,000
  • 0 ≤ gap ≤ 1,000
  • 같은 시간대에 겹치는 신청이 여러 개 들어올 수 있습니다

시간 복잡도 목표: O(N log N)

테스트 케이스

예시 1: 신청 7건, 정리 시간 10분 → 3건 승인
입력: requests = [[0,60],[30,90],[60,120],[75,135],[130,180],[150,210],[200,240]], gap = 10
출력: 3
예시 2: 정리 시간이 없어 꼬리물기 전부 승인
입력: requests = [[0,45],[45,90],[90,135],[135,180]], gap = 0
출력: 4
예시 3: 긴 예약 하나를 포기하는 편이 이득
입력: requests = [[0,240],[20,50],[60,110]], gap = 5
출력: 2
예시 4: 정리 시간이 길어 중간 예약이 밀림
입력: requests = [[0,20],[25,45],[50,70]], gap = 30
출력: 2
신청이 하나뿐
입력: requests = [[300,360]], gap = 90
출력: 1
0분 시작 + 정리 시간이 정확히 맞아떨어짐
입력: requests = [[0,30],[35,65],[70,100],[105,140]], gap = 5
출력: 4
겹치는 신청이 뒤섞인 경우
입력: requests = [[10,20],[15,40],[18,25],[30,50],[45,60]], gap = 0
출력: 2
정리 시간 때문에 이어붙일 수 없는 구간들
입력: requests = [[100,160],[110,150],[150,200],[155,175],[200,230]], gap = 15
출력: 2
solution.ts
에디터 로딩 중…

▶ 실행은 기록 없이 채점만, 제출은 결과가 진행률·오답노트에 기록됩니다.