15649 N과 M (1)
https://www.acmicpc.net/problem/15649
문제설명
- 수열의 길이는 M이다.
- 수열의 각 원소는 1부터 N까지의 정수 중 하나이다.
- 수열은 오름차순으로 정렬되어야 한다
주어진 N과 M에 대해, 가능한 모든 수열을 출력한다.
접근방식
깊이 M까지 탐색: 각 깊이에서 N개의 선택이 가능하므로, M 깊이까지 탐색하면 N^M개의 수열을 생성한다.
각 수열의 처리: 각 수열을 저장하는 데 걸리는 시간은 O(M)이다.
DFS를 사용하여 모든 가능한 수열을 탐색하는 경우 O(N ^ M) 의 시간복잡도가 소요된다.
문제 조건 분석 과정
- 깊이 우선 탐색(DFS) 알고리즘을 활용하여 모든 가능한 수열을 탐색하고, 유효한 수열을 찾을 때마다 결과를 저장한다.
전체코드
import java.util.*;
import java.io.*;
public class Main {
public static int N, M; // N과 M을 저장할 변수
public static int[] arr; // 결과를 저장할 배열
public static StringBuilder sb = new StringBuilder(); // 결과를 문자열로 저장할 StringBuilder
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " "); // 입력 문자열을 공백으로 나누기 위한 StringTokenizer
N = Integer.parseInt(st.nextToken()); // N 값을 파싱
M = Integer.parseInt(st.nextToken()); // M 값을 파싱
arr = new int[M]; // 길이가 M인 배열 생성
dfs(1, 0); // DFS 호출 (시작 인덱스 1, 깊이 0)
System.out.println(sb); // 결과 출력
}
public static void dfs(int at, int depth) {
if (depth == M) { // 깊이가 M에 도달하면
for (int val : arr) { // 배열의 각 값 출력
sb.append(val).append(' ');
}
sb.append('\n'); // 줄바꿈 추가
return; // 종료
}
for (int i = at; i <= N; i++) { // 현재 인덱스 at부터 N까지 반복
arr[depth] = i; // 배열의 현재 깊이에 i 값을 저장
dfs(i, depth + 1); // 다음 깊이로 재귀 호출
}
}
}
'자료구조 > 문제풀이' 카테고리의 다른 글
[백준 JAVA] 16987 계란으로 계란치기 (1) | 2024.09.13 |
---|---|
[백준 JAVA] 1941 소문난 칠공주 (0) | 2024.09.13 |
[백준 JAVA] 15652 N과 M (4) (0) | 2024.09.13 |
[백준 JAVA] 9663 N-Queen (0) | 2024.09.13 |
[백준 JAVA] 11279 최대 힙 (0) | 2024.09.13 |