학습 목표: 그리디 선택 기준을 제안하고 왜 안전한지 설명합니다. 모든 예시는 주어진 매개변수를 처리해 정답을 반환하는 solution 함수로 완성합니다.
문제를 푸는 기준
그리디는 지금 좋아 보이는 것을 고르는 기법이 아니라 그 선택이 이후 최적 가능성을 해치지 않는다는 근거가 있는 알고리즘입니다.
핵심 개념
| 개념 | 코딩테스트에서의 역할 |
|---|---|
| 탐욕적 선택 | 현재 단계에서 이후 가능성을 가장 많이 남기는 후보를 고릅니다. |
| 교환 논리 | 최적해의 선택을 그리디 선택으로 바꿔도 손해가 없음을 보입니다. |
| 반례 탐색 | 작은 사례로 선택 기준이 깨지는지 확인합니다. |
대표 문제
최대 회의 개수
회의 [start,end] 배열 meetings에서 서로 겹치지 않게 선택할 수 있는 최대 개수를 반환하세요. 끝나는 시각에 다음 회의를 시작할 수 있습니다.
함수 시그니처: solution(meetings)
제한사항
- meetings의 길이는 0 이상 200,000 이하입니다.
- start는 end 이하입니다.
입출력 예
| 매개변수 | 반환값 |
|---|---|
[[1,4],[2,3],[3,5],[5,7]] | 3 |
[] | 0 |
풀이 설계
- 종료 시각 오름차순으로 정렬합니다.
- 가장 빨리 끝나는 회의를 먼저 선택합니다.
- 다음 시작이 마지막 종료 이상이면 선택합니다.
JavaScript 풀이
function solution(meetings) {
const sorted = [...meetings].sort((a, b) => a[1] - b[1] || a[0] - b[0]);
let count = 0;
let lastEnd = -Infinity;
for (const [start, end] of sorted) {
if (start < lastEnd) continue;
count += 1;
lastEnd = end;
}
return count;
}복잡도
- 시간복잡도:
O(n log n) - 공간복잡도:
O(n) - 핵심 패턴: 가장 빨리 끝나는 구간부터 선택
- 경계 사례: 끝과 시작이 같으면 연속 선택 가능
연습 문제
1. 두 명 보트
최대 두 명일 때 최소 보트 수를 구하세요.
힌트
가장 무거운 사람과 가장 가벼운 사람
2. 숫자 제거
k개를 지워 가장 큰 수를 만드세요.
힌트
단조 스택
3. 동전 최소 개수
배수 동전 체계에서 최소 동전 수를 구하세요.
힌트
큰 동전부터 선택의 정당성 확인
자주 하는 실수
- 정당성 없이 직감으로 기준을 정하는 실수
- 시작 시각이 빠른 회의를 먼저 고르는 실수
- 동률 정렬 기준을 빼는 실수
- 끝과 시작이 같은 경우를 확인하지 않는 실수
핵심 정리
- 함수 시그니처와 반환 자료형을 먼저 확정합니다.
- 제한사항으로 가능한 시간복잡도를 판단합니다.
- 예시와 경계 사례를 손으로 추적한 뒤 구현합니다.
- 완성한
solution함수가 입력을 불필요하게 바꾸지 않는지도 확인합니다.
확인 문제
문제 14지선다
종료 시각이 빠른 회의를 먼저 고르는 이유는?
문제 24지선다
대표 문제의 시간복잡도로 알맞은 것은?
문제 34지선다
최대 회의 개수에서 사용한 핵심 패턴은?
문제 44지선다
대표 문제에서 반드시 확인할 경계 사례는?
문제 54지선다
이 과정의 정답 코드가 지켜야 할 계약은?
참고 자료
Last updated on