[Algorithm /백준] N과 M (1)
2023. 11. 2. 12:00ㆍAlgorithm/JAVA
[문제]
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
[입력]
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
[출력]
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
[예제 입력1]
3 1
[예제 출력1]
1
2
3
[예제 입력2]
4 2
[예제 출력2]
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
[문제 해결]
import java.util.Scanner;
public class Main {
/*
*N과 M 출력 예시
(4,2)
[출력]
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
=> M만큼 가로로 출력
N만큼 세로로 출력
M == N인 경우는 넣지 않음.
*/
private static boolean[] visit;
private static int[] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
visit = new boolean[n]; //n은 세로로 출력되는 요소 체크해줌.
arr = new int[m]; //m은 가로로 출력되는 요소를 담아둠.
for(int i = 0; i <visit.length;i++) {
visit[i] = false;
}
Main nm = new Main();
nm.printNanM(n,m,0);
}
public void printNanM(int n, int m, int depth) {
if(depth == m) {
for(int i = 0 ; i < m; i++) {
System.out.print(arr[i]+ " ");
}
System.out.println();
return;
}
else {
for(int i=0 ; i < n; i++) { //세로로 출력되는 요소
if(!visit[i]) {
arr[depth]= i+1; //가로로 출력되는 요소
visit[i] = true;
printNanM(n, m , depth+1);
visit[i] = false;
}
}
}
}
}
+) 개인적으로 이해하기 너무너무 어려웠던 문제... 백트래킹 너무어렵다......................
'Algorithm > JAVA' 카테고리의 다른 글
[Algorithm /프로그래머스] 네트워크 (0) | 2023.11.02 |
---|---|
[Algorithm /인프런] 재귀함수를 이용한 이진수 출력 (0) | 2023.11.02 |
[Algorithm /백준 ] 수 찾기 (+ 문제 이해 ) (0) | 2023.11.02 |
[Algorithm /인프런] 재귀함수 (1) | 2023.11.01 |
[Algorithm /프로그래머스] 짝지어 제거하기 (0) | 2023.10.31 |