-
[백준] 15654. N과 M (5)PS/Java 2022. 7. 19.
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력
4 2 9 8 7 1
예제 출력
1 7 1 8 1 9 7 1 7 8 7 9 8 1 8 7 8 9 9 1 9 7 9 8
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Collections; import java.util.StringTokenizer; public class Main { public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); public static ArrayList<Integer> list; public static int[] arr; public static boolean[] visited; public static int N, M; public static void main(String[] args) throws Exception { StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); visited = new boolean[N]; arr = new int[M]; list = new ArrayList<>(); for(int i = 0; i < N; i++) { list.add(Integer.parseInt(st.nextToken())); } Collections.sort(list); backTrack(0); br.close(); bw.flush(); bw.close(); } public static void backTrack(int idx) throws Exception { if(idx == M) { for(int k : arr) { bw.write(k + " "); } bw.newLine(); return; } for(int i = 0; i < N; i++) { if(!visited[i]) { arr[idx] = list.get(i); visited[i] = true; backTrack(idx + 1); visited[i] = false; } } } }
먼저 입력받은 리스트들을 오름차순으로 정렬한다.
1 7 8 9 중 2개를 뽑는걸 보면 자기 자신을 제외한 값들만 들어간다.
visited배열을 이용해 지나온 값을 true로 바꿔주고 다음 값으로 넘어가고 다시 false로 바꿔준다(백트래킹)
'PS > Java' 카테고리의 다른 글
[백준] 11660. 구간 합 구하기 5 (0) 2022.09.20 [백준] 13549. 숨바꼭질 3 (0) 2022.07.19 [백준] 1865. 웜홀 (0) 2022.07.19 [백준] 10026. 적록색약 (0) 2022.07.19 [백준] 19581. 두 번째 트리의 지름 (0) 2022.07.19