리주의 프로그래밍 공부

[15652] N과 M (4) 본문

알고리즘 공부(백준)

[15652] N과 M (4)

Leezu_ 2021. 3. 19. 14:34

방금 전에 올린 N과 M(2) 문제에서 하나만 수정하면 바로 맞추는 문제였다.

(혹시나 15650 N과 M(2)를 풀지 않았다면 그거먼저 풀고오면 도움이 될듯하다.)

 

[15650] N과 M (2)

다시 풀어보는 백트래킹 문제. 아직까지도 완벽히 숙지하지 못한 것 같다. (바로 N과 M 다른문제 풀러가야지) 우선 이 문제는 visited 배열이 필요가 없다. 왜냐하면 재귀적으로 호출할 때, +1을 해

leezu-prog.tistory.com

dfs를 호출할 때, i+1에서 i로만 바꿔주면 된다. 이유는 중복가능하기 때문이다.

비내림차순은 dfs를 아래서부터 시작하면 자연스레 따라온다.

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class Main {
	static int n,m;
	static int[] arr;
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);

		n = sc.nextInt();
		m = sc.nextInt();
		
		arr = new int[m];
		dfs(1, 0);
		bw.flush();
	}
	
	public static void dfs(int a, int cnt) throws IOException {
//		System.out.println("a : " + a + " cnt : " + cnt);
		if(cnt == m) {
			for(int i=0; i<m; i++) {
				bw.write(arr[i] + " ");
			}
			bw.write("\n");
		} else {
			for(int i=a; i<=n; i++) {
				arr[cnt] = i;
                // N과 M (2)번문제에서는 a자리에 i+1을 넣었다.
				dfs(i, cnt + 1);
			}
		}
		
	}
}

 

'알고리즘 공부(백준)' 카테고리의 다른 글

[1991] 트리 순회  (0) 2021.03.22
[11650] 좌표 정렬하기  (0) 2021.03.19
[15650] N과 M (2)  (0) 2021.03.19
[15651] N과 M (3)  (0) 2021.03.18
[9663] N-Queen  (0) 2021.03.18