📌 문제 설명
10 이하의 N개의 자연수가 주어졌을 때 이 중 M개를 선택하여 일렬로 나열하는 모든 순열을 출력하라.
- 중복 없이 선택해야 하며
- 순서를 고려하여 나열해야 한다.
- 출력은 사전순(오름차순) 으로 정렬되어야 한다.
📝 입력 & 출력
입력
- 첫 줄: 자연수 N, M (3 ≤ N ≤ 10, 2 ≤ M ≤ N)
- 둘째 줄: N개의 자연수 (오름차순)
출력
- 가능한 모든 순열을 한 줄에 하나씩 출력
- 출력 순서는 사전순으로 오름차순
🔹 예제 입력 & 출력
예제 입력
3 2
3 6 9
예제 출력
3 6
3 9
6 3
6 9
9 3
9 6
💡 해결 방법
✅ 핵심 전략: DFS + 방문 체크 배열
- DFS를 통해 깊이 L까지 탐색
- 현재 선택한 수를 pm[L]에 저장
- 중복 방지를 위해 ch[i] 배열로 방문 여부 체크
- 순열 생성이 끝나면 출력
💻 코드 구현 (Java)
package partDfsBfs;
import java.util.*;
public class Problem6 {
static int[] pm, ch, arr;
static int n, m;
public void DFS(int L) {
if (L == m) {
for (int x : pm) System.out.print(x + " ");
System.out.println();
} else {
for (int i = 0; i < n; i++) {
if (ch[i] == 0) {
pm[L] = arr[i];
ch[i] = 1;
DFS(L + 1);
ch[i] = 0; // 백트래킹
}
}
}
}
public static void main(String[] args) {
Problem6 T = new Problem6();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
arr = new int[n];
ch = new int[n];
pm = new int[m];
for (int i = 0; i < n; i++) arr[i] = kb.nextInt();
T.DFS(0);
kb.close();
}
}
📖 코드 설명
1️⃣ 입력 및 초기화
arr = new int[n]; // 입력 숫자 배열
ch = new int[n]; // 방문 체크 배열
pm = new int[m]; // 결과를 저장할 순열 배열
2️⃣ DFS 함수 구조
DFS(L + 1); // 다음 깊이로 진입
ch[i] = 0; // 백트래킹: 방문 해제
- 방문하지 않은 수만 선택 (ch[i] == 0)
- 하나 선택 후 다음 깊이로 이동
- 돌아와서 방문 해제 (백트래킹)
3️⃣ 종료 조건
if (L == m) {
for (int x : pm) System.out.print(x + " ");
System.out.println();
}
- 깊이 m에 도달했을 때 현재 순열을 출력
⏳ 시간 복잡도 분석
- 총 경우의 수: P(N, M) = N! / (N - M)!
- 각 경로는 O(M)
- 전체 탐색은 O(N! / (N - M)!) 수준 → N ≤ 10이라 완전탐색 가능
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
https://www.inflearn.com/course/자바-알고리즘-문제풀이-코테대비/dashboard
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 8 DFS, BFS - 8. 수열 추측하기 (2) | 2025.05.22 |
|---|---|
| 섹션 8 DFS, BFS - 7. 조합의 경우수(메모이제이션) (1) | 2025.05.14 |
| 섹션 8 DFS, BFS - 5. 동전교환 (0) | 2025.05.14 |
| 섹션 8 DFS, BFS - 4. 중복순열 구하기 (1) | 2025.05.06 |
| 섹션 8 DFS, BFS - 3. 최대점수 구하기(DFS) (1) | 2025.05.06 |