반응형
[Silver III] N과 M (4) - 15652
성능 요약
메모리: 15976 KB, 시간: 84 ms
분류
백트래킹
제출 일자
2024년 12월 6일 04:35:21
문제 설명
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
풀이 및 코드
수열은 사전 순으로 증가하는 순서로 출력해야 하므로 오름차순으로 dfs 탐색.
숫자 k를 뽑으면 중복을 허용하므로 k, k+1, ... n 중 하나 뽑는 것을 가정하며 dfs 탐색한다.
m개의 숫자를 뽑으면 백트래킹한다.
import java.io.*;
import java.util.*;
public class Main {
private static int n, m;
private static StringBuilder answer = new StringBuilder();
private static void dfs(int i, String select, int count){
if(count == m){ // m개의 숫자를 뽑았으면 return
answer.append(select);
answer.append("\n");
return;
}
// 같은 수를 여러번 골라도 되므로 다음 탐색 숫자에 i를 포함한다.
for(int j = i; j <= n; j++){
dfs(j, select+j+" ", count+1);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
br.close();
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
dfs(1, "", 0);
System.out.println(answer);
}
}
728x90
반응형
'코딩 테스트 정복기 > 백준' 카테고리의 다른 글
[백준/Silver II] A → B - 16953 (0) | 2024.12.19 |
---|---|
[백준/Silver II] N과 M (12) - 15666 (1) | 2024.12.18 |
[백준/Gold V] 내려가기 - 2096 (0) | 2024.12.16 |
[백준/Gold III] 벽 부수고 이동하기 - 2206 (3) | 2024.12.14 |
[백준/Gold IV] 플로이드 - 11404 (0) | 2024.12.13 |