반응형
https://www.acmicpc.net/problem/15656
15656번: N과 M (7)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
문제
- N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
입력
- 첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
- 둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
- 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.
- 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
- 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
입출력 예제

풀이방식설계
[ DFS 중에서도 백트래킹에 대한 문제임을 인식하고 풀어보자. ]
1. 배열에 입력받은 자연수들을 넣고 정렬한다.
2. 해당 레벨에 대한 탐색을 완료하였으면 재귀함수를 호출해 다음 레벨을 탐색한다.
- 각 레벨에서 자기 자신을 포함한 모든 경우의 수열을 출력해야 하기에 중복 관련 코드는 없다.
- 모든 경우를 탐색하고 다음 레벨로 넘어가기에 하라미터는 레벨에 1을 더해서 넘겨준다.
3. 레벨이 M과 동일하지 않다면 탐색을 계속하고, 동일하다면 결과를 출력한다.
풀이과정
1. 사용한 변수들은 다음과 같다.
- graph[ ] : 결과값을 저장할 배열(M 개씩 출력해야한다.)
- arr[ ] : 입력값을 저장할 배열
2. arr 배열에 입력값들을 저장하고 정렬한다.
3. for문을 통해 탐색을 진행하며 graph 배열에 arr[i] 값을 넣어준다.
- 입력받은 수들이 조건에 일치하다면 결과값으로 출력하기 위해 graph 배열에 값을 넣어준다.
4. 해당 레벨에 탐색을 완료했다면 다음 레벨을 탐색하기 위해 depth에 1를(을) 더해서 DFS 재귀함수를 호출한다.
- 해당 레벨에 대한 모든 경우를 탐색했으므로 다음 레벨로 넘어가기 위해 레벨을 더해준다.
5. depth가 M과 동일하지 않다면 탐색을 계속한다.
6. depth가 M과 동일하다면 모든 레벨을 탐색한 것이기에 출력한다.
답안소스
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { static int N, M; static int[] ch, graph, arr; static StringBuilder sb = new StringBuilder(); public void DFS(int depth) { if(depth == M) { for(int x : graph) { sb.append(x + " "); } sb.append("\n"); } else { for(int i=0; i<N; i++) { graph[depth] = arr[i]; DFS(depth+1); } } } public static void main(String[] args) throws IOException { Main sev = new Main(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); graph = new int[M]; arr = new int[N]; st = new StringTokenizer(br.readLine()); for(int i=0; i<N; i++) { arr[i] = Integer.parseInt(st.nextToken()); } Arrays.sort(arr); sev.DFS(0); System.out.println(sb); } }
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 알고리즘 자바] 15654 : N과 M (9) (0) | 2023.02.13 |
---|---|
[백준 알고리즘 자바] 15654 : N과 M (8) (0) | 2023.02.09 |
[백준 알고리즘 자바] 15654 : N과 M (6) (0) | 2023.02.07 |
[백준 알고리즘 자바] 15654 : N과 M (5) (0) | 2023.02.06 |
[백준 알고리즘 자바] 2292 : 벌집 (0) | 2023.01.29 |