๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 15649๋ฒˆ: N๊ณผ M (1) (dfs, ๋ฐฑํŠธ๋ž˜ํ‚น)

by ์ฃผ๋ฐœ2 2020. 2. 18.
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/15649

 

15649๋ฒˆ: N๊ณผ M (1)

ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ˆ˜์—ด์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ฅํ•˜๋ฉด ์•ˆ๋˜๋ฉฐ, ๊ฐ ์ˆ˜์—ด์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜์—ด์€ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

www.acmicpc.net

์ฝ”๋“œ

import java.util.Scanner;

public class Main {
	static int arr[];
	static boolean visit[];
	static int N;
	static int M;
	static StringBuilder sb = new StringBuilder();
	
	public static void dfs(int count) {
		// dfs ํ•จ์ˆ˜ ํƒˆ์ถœ - ๋ฝ‘์€ ๊ฐฏ์ˆ˜์™€ M์ด ๋™์ผํ•  ๋•Œ
		if(count == M) {
			// StringBuilder ์— ๋ฝ‘์€ ๊ฐ’(arr) ์ €์žฅ
			for(int i : arr)	
				sb.append(i + " ");
			sb.append("\n");
			return;
		}
		
		// ๋ฝ‘์ง€์•Š์€๊ฒƒ -> dfs ์žฌ๊ท€ํ˜ธ์ถœ
		for(int i=1; i<=N; i++) {
			if(!visit[i]) {
				visit[i] = true;	// ๋ฐฉ๋ฌธ ์ฒดํฌ
				arr[count] = i;		// ๋ฝ‘๊ธฐ
				dfs(count+1);		// ๊ทธ ๋‹ค์Œ ๊ฐ’ ๋ฝ‘๊ธฐ์œ„ํ•ด ์žฌ๊ท€ํ˜ธ์ถœ
				visit[i] = false;	// ๋ฝ‘์€ ๋’ค ๋ฏธ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
			}
		}
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt();
		M = scan.nextInt();
		arr = new int[M];
		visit = new boolean[N+1];
		dfs(0);
		System.out.print(sb);
		scan.close();
	}

}

ํ’€์ด

์ˆœ์—ด๊ณผ ์กฐํ•ฉ์˜ ์ฒซ๋ฒˆ์งธ๋ฌธ์ œ, 

dfs๋ฅผ ํ†ตํ•ด ๊นŠ์ˆ™ํžˆ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์„ ๋ฝ‘๊ณ , ๋ฝ‘์€๊ฐฏ์ˆ˜๊ฐ€ M๊ณผ ๋™์ผํ•  ๋•Œ(dfs ํƒˆ์ถœ)

StringBuilder ์— ๋„ฃ์–ด์ค€๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€