반응형
[Silver III] N과 M (5) - 15654
성능 요약
메모리: 83852 KB, 시간: 948 ms
분류
백트래킹
제출 일자
2024년 10월 24일 18:15:27
문제 설명
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
제출 코드
//https://www.acmicpc.net/problem/15654
import java.io.*;
import java.util.Arrays;
public class Main {
static int[] arr; // 전역변수로 arr 지정
static void dfs(int c, int n, int m, String s){
if(m == 1){ // m==1이면 m만큼 숫자를 뽑은 것이므로 출력 후 리턴
System.out.println(s);
return;
}
int temp = arr[c]; // arr[c]값을 temp에 담음
arr[c] = 0; // arr[c]를 0으로 만들어서 이미 뽑은 숫자임을 체크
for(int i = 0; i < n; i++){
if(arr[i] != 0){ // arr[c]가 0이 아니면 (뽑은 숫자가 아니면)
dfs(i, n, m-1, s+" "+arr[i]); // 재귀 호출
}
}
arr[c] = temp; // arr[c]에 다시 원래 값 넣어줌
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] temp = br.readLine().split(" ");
int n = Integer.parseInt(temp[0]);
int m = Integer.parseInt(temp[1]);
arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(arr);
for(int i = 0; i < n; i++){
dfs(i, n, m, arr[i]+"");
}
}
}
728x90
반응형
'코딩 테스트 정복기 > 백준' 카테고리의 다른 글
[백준/Silver I] 트리 순회 - 1991 (0) | 2024.11.02 |
---|---|
[백준/Silver II] N과 M (9) - 15663 (0) | 2024.10.31 |
[백준/Silver III] N과 M (2) - 15650 (0) | 2024.10.31 |
[백준/Gold V] 적록색약 - 10026 (0) | 2024.10.22 |
[백준/Gold V] AC - 5430 (1) | 2024.10.21 |