학습 목표: 제한사항이 작을 때 완전탐색을 선택하고 중복 없이 후보를 열거합니다. 모든 예시는 주어진 매개변수를 처리해 정답을 반환하는 solution 함수로 완성합니다.
문제를 푸는 기준
완전탐색은 제한사항 안에서 가장 단순하고 확실한 풀이일 수 있습니다. 후보 수와 후보 하나의 검사 비용을 곱해 먼저 판단합니다.
핵심 개념
| 개념 | 코딩테스트에서의 역할 |
|---|---|
| 후보 공간 | 가능한 답의 총개수를 먼저 계산합니다. |
| 중첩 반복 | 선택 개수가 고정되어 작을 때 직접 열거합니다. |
| 중복 제어 | 인덱스 순서를 고정해 같은 조합을 여러 번 세지 않습니다. |
대표 문제
세 수의 목표 합
정수 배열 numbers에서 서로 다른 세 인덱스를 골라 합이 target이 되는 조합의 개수를 반환하세요.
함수 시그니처: solution(numbers, target)
제한사항
- numbers의 길이는 3 이상 100 이하입니다.
- 같은 값이 서로 다른 인덱스에 있을 수 있습니다.
입출력 예
| 매개변수 | 반환값 |
|---|---|
[1,2,3,4], 6 | 1 |
[0,0,0,0], 0 | 4 |
풀이 설계
- i를 첫 인덱스로 고릅니다.
- j는 i 뒤, k는 j 뒤에서 고릅니다.
- 합이 target이면 개수를 늘립니다.
JavaScript 풀이
function solution(numbers, target) {
let count = 0;
for (let i = 0; i < numbers.length - 2; i += 1) {
for (let j = i + 1; j < numbers.length - 1; j += 1) {
for (let k = j + 1; k < numbers.length; k += 1) {
if (numbers[i] + numbers[j] + numbers[k] === target) count += 1;
}
}
}
return count;
}복잡도
- 시간복잡도:
O(n³) - 공간복잡도:
O(1) - 핵심 패턴: 증가하는 인덱스로 고정 개수 조합 전부 확인
- 경계 사례: 값이 같아도 인덱스가 다르면 별도 조합
연습 문제
1. 반복 답안 점수
세 답안 패턴의 최고 득점자를 반환하세요.
힌트
나머지 인덱스
2. 카펫 크기
칸 수 조건에 맞는 가로·세로를 반환하세요.
힌트
약수 쌍 열거
3. 숫자 카드 소수
카드를 이어 만들 수 있는 소수 수를 구하세요.
힌트
순열과 Set
자주 하는 실수
- 후보 수를 계산하지 않는 실수
- 인덱스 순서를 고정하지 않아 중복 계산하는 실수
- 값 중복과 인덱스 중복을 혼동하는 실수
- 반복 경계를 하나 빠뜨리는 실수
핵심 정리
- 함수 시그니처와 반환 자료형을 먼저 확정합니다.
- 제한사항으로 가능한 시간복잡도를 판단합니다.
- 예시와 경계 사례를 손으로 추적한 뒤 구현합니다.
- 완성한
solution함수가 입력을 불필요하게 바꾸지 않는지도 확인합니다.
확인 문제
문제 14지선다
완전탐색 선택 전에 가장 먼저 확인할 것은?
문제 24지선다
대표 문제의 시간복잡도로 알맞은 것은?
문제 34지선다
세 수의 목표 합에서 사용한 핵심 패턴은?
문제 44지선다
대표 문제에서 반드시 확인할 경계 사례는?
문제 54지선다
이 과정의 정답 코드가 지켜야 할 계약은?
참고 자료
Last updated on