Sliver
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
조건 1
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
풀이
import java.util.*;
public class Main {
static boolean[] visited;
static int[] result;
static StringBuilder sb;
static int N, M;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
sb = new StringBuilder();
N = sc.nextInt();
M = sc.nextInt();
result = new int[M];
visited = new boolean[N];
dfs(0);
sc.close();
}
public static void dfs(int count){
if(count == M){
print();
return;
}
for(int i=0; i<N; i++){
if(!visited[i]){
visited[i] = true;
result[count] = i+1;
dfs(count+1);
visited[i] = false;
}
}
}
public static void print(){
for(int i=0; i<M; i++){
System.out.print(result[i] + " ");
}
System.out.println();
}
}
중복을 없애기 위해 visited 배열 만들어 방문하였음을(이미 선택했음을) 체크할 수 있도록 하였다.
조건2
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
풀이
import java.util.*;
public class Main {
static int[] result;
static int N, M;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
result = new int[M];
dfs(0,0);
sc.close();
}
public static void dfs(int depth, int start){
if(depth == M){
print();
return;
}
for(int i=start; i<N; i++){
result[depth] = i+1;
dfs(depth+1, i+1);
}
}
public static void print(){
for(int i=0; i<result.length; i++){
System.out.print(result[i] + " ");
}
System.out.println();
}
}
조건3
- 1부터 N까지 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
풀이
import java.util.*;
class Main {
static int[] result;
static int N, M;
static StringBuilder sb;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sb = new StringBuilder();
N = sc.nextInt();
M = sc.nextInt();
result = new int[M];
dfs(0);
System.out.print(sb);
sc.close();
}
public static void dfs(int index){
if(index == M){
print();
return;
}
for(int i=0; i<N; i++){
result[index] = i+1;
dfs(index+1);
}
}
public static void print(){
for(int i=0; i<result.length; i++){
sb.append(result[i] + " ") ;
}
sb.append("\n");
}
}
조건4
- 1부터 N까지 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
풀이
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
static int N, M;
static int[] result;
static StringBuilder sb;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sb = new StringBuilder();
N = sc.nextInt();
M = sc.nextInt();
result = new int[M];
dfs(0, 0);
System.out.println(sb);
sc.close();
}
public static void dfs(int depth, int start){
if(depth == M){
print();
return;
}
for(int i=start; i<N; i++){
result[depth] = i+1;
dfs(depth+1,i);
}
}
public static void print(){
for(int i=0; i<result.length; i++){
sb.append(result[i] + " ");
}
sb.append("\n");
}
}
https://www.acmicpc.net/problem/15649
https://www.acmicpc.net/problem/15650
https://www.acmicpc.net/problem/15651
https://www.acmicpc.net/problem/15652
'Algorithm > Baekjoon Oline Judge - Java' 카테고리의 다른 글
[백준]1932 정수삼각형 / 동적계획법 DP (0) | 2024.07.28 |
---|---|
[백준] 1149 RGB거리 / 동적계획법 DP (0) | 2024.07.28 |
[백준] 1463_1로만들기 / 동적계획법 DP (0) | 2024.07.14 |
[백준] 1912_연속합 / 동적계획법 DP (0) | 2024.07.14 |
[백준] 2108_통계학 / Collections 클래스 (1) | 2024.07.14 |