BOJ 15649) N과 M(1)
- [ 기타 ]/백준, 프로그래머스
- 2021. 12. 30.
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
해결
1부터 N까지의 자연수 중에서 중복 없이 M개를 고른다고 했으니, dfs를 이용한 백트래킹으로 구현하면 되겠다고 생각이 들었다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 1부터 N까지 자연수 중에서 중복없이 M개를 고른 수열.
int N = sc.nextInt();
int M = sc.nextInt();
boolean[] isVisited = new boolean[N+1];
int[] arr = new int[M+1];
for(int i=0; i<N+1; i++)
isVisited[i] = false;
dfs(isVisited, arr, N, M, 0);
}
private static void dfs(boolean[] isVisited, int[] arr, int N, int M, int depth) {
if(depth==M) {
for (int i=1; i<M+1; i++)
System.out.print(arr[i] + " ");
System.out.println();
return;
}
for(int i=1; i<=N; i++) {
if(!isVisited[i]) { //유망성 판단, dfs
isVisited[i]=true;
arr[depth+1] = i;
dfs(isVisited, arr, N, M, depth + 1);
isVisited[i]=false;
}
}
}
}
유망성을 판단할 기준이 방문 여부이므로, 방문 여부를 체크하여 유망한지 여부를 판단한다. 만약 유망한지 여부를 판단하지 않는다면 브루트포스를 이용한 탐색과 다를 바 없게 된다. 또한 이 문제에서는 브루트포스만을 이용한 탐색 방법이 훨씬 생각하기도 복잡할 것 같다.
'[ 기타 ] > 백준, 프로그래머스' 카테고리의 다른 글
BOJ 2580) 스도쿠 (0) | 2022.01.14 |
---|---|
BOJ 2156) 포도주 시식 (0) | 2022.01.03 |
BOJ 1018) 체스판 다시 칠하기 (0) | 2021.12.29 |
BOJ 1012) 유기농 배추 (0) | 2021.12.27 |
BOJ 1699) 제곱수의 합 (0) | 2021.12.20 |