PS❯BOJ2021-11-292 min read
[BOJ 6603] 로또 - Java (백트래킹 조합 재귀 탐색)
주어진 k개의 숫자 중 6개를 오름차순으로 선택하는 모든 조합을 사전식 순서로 탐색하는 백트래킹 기초 풀이
#BOJ#백트래킹#재귀#조합#Java
1. 문제 개요 및 조건 분석
| 항목 | 내용 |
|---|---|
| 문제 이름 | 로또 (백준 6603번 / 실버 2) |
| 플랫폼 / 난이도 | 백준 (실버 2, 6603번) |
| 문제 링크 | 백준 6603번 |
| 제한 사항 | 시간 제한 1초, 메모리 제한 128MB |
| 입력 조건 | 집합 크기 $k$ ($6 < k < 13$), 각 정수 집합 $S$ (오름차순 주어짐), 입력 마지막 줄은 0 |
| 핵심 규칙 | 주어진 $k$개의 숫자 중 6개를 골라 오름차순 사전순으로 모두 출력 |
2. 접근 아이디어: 백트래킹(Backtracking) 조합
- 독일 로또 번호 49개 중 $k$개의 수를 골라 그중 6개를 뽑는 모든 조합을 출력하는 문제입니다.
- $k < 13$이므로 최대 경우의 수는 $\binom{12}{6} = 924$가지로 매우 작습니다.
- 사전식 순서 출력을 위해 이미 정렬되어 주어진 배열에서 인덱스 오름차순으로 6개를 뽑는 재귀 백트래킹(
dfs(start, depth))을 수행합니다.
3. Java 풀이 코드
import java.io.*;
import java.util.*;
public class Main {
static int k;
static int[] s;
static int[] picked = new int[6];
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = br.readLine();
if (line == null || line.equals("0")) break;
StringTokenizer st = new StringTokenizer(line);
k = Integer.parseInt(st.nextToken());
s = new int[k];
for (int i = 0; i < k; i++) {
s[i] = Integer.parseInt(st.nextToken());
}
comb(0, 0);
sb.append("\n");
}
System.out.print(sb);
}
static void comb(int start, int depth) {
if (depth == 6) {
for (int i = 0; i < 6; i++) {
sb.append(picked[i]).append(" ");
}
sb.append("\n");
return;
}
for (int i = start; i < k; i++) {
picked[depth] = s[i];
comb(i + 1, depth + 1);
}
}
}
4. 복잡도 분석
- 시간 복잡도: $O\left(\binom{k}{6}\right)$ — $k \le 12$일 때 각 케이스당 최대 924회 탐색으로 0.1초 이내에 통과.
- 공간 복잡도: $O(k)$ — 크기 $k$의 배열 및 최대 깊이 6의 재귀 호출 스택.
5. 채점 결과 및 통과 인증

← PREVIOUS LOG
[BOJ 14889] 스타트와 링크 - Java (백트래킹 & 팀 조합 시뮬레이션)
NEXT LOG →[BOJ 2152] 여행 계획 세우기 - Java (SCC 강한 연결 요소 & 위상 정렬 DP)
COMMENTS // GITHUB DISCUSSIONS (GISCUS)