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

๐“ก๐“ธ๐“ธ๐“ถ๐Ÿฃ: ๐’œ๐“๐‘”๐‘œ๐“‡๐’พ๐“‰๐’ฝ๐“‚/๐“ก๐Ÿฃ๐Ÿข๐Ÿฃ: ๐’œ๐“๐‘”๐‘œ๐“‡๐’พ๐“‰๐’ฝ๐“‚

[ALPS Study] DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰) - ์œ ๊ธฐ๋†๋ฐฐ์ถ”(BOJ 1012)

์ž ์ด๋ฒˆ์—” ๋ฐ”๋กœ ํ’€์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ•  ์ง€ ์ƒ๊ฐํ•ด๋ณด๊ณ  ํ’€์–ด์•ผ๊ฒ ๋‹ค.

์‚ฌ์‹ค ๋‚œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€ ๋•Œ ์•ž ๋’ค ์•ˆ๊ฐ€๋ฆฌ๊ณ  ๋ฌด์ž‘์ • ์ฝ”๋“œ์งœ๋Š” ๋ฒ„๋ฆ‡์ด ์žˆ๋Š”๋ฐ ์•ˆ ์ข‹์€..๋ฒ„๋ฆ‡์ด๋‹ค..

 

์šฐ์„ ์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๊ณ  ์ž…๋ ฅ๋ฐ›์€๋งŒํผ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด ์ค„ ๊ฒƒ์ด๋‹ค. 

int main() {
	int T;
	int i;
	scanf("%d", &T);
	
	for (i = 0; i < T; i++) {
		func();
	}
}

๋Œ€์ถฉ ๋ญ ์ด๋Ÿฐ์‹์œผ๋กœ!

๊ทธ๋Ÿฐ ๋‹ค์Œ์— ์ด์ œ ๋ชจ๋“ ! ์ฒ˜๋ฆฌ๋Š” func() ์ด๋ผ๋Š” ํ•จ์ˆ˜์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

์šฐ์„  M, N, K๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์•ผ๊ฒ ์ง€? ๊ทธ๋ฆฌ๊ณ  map์ •๋ณด๋ฅผ ์ €์žฅํ•  map[50][50]์ด๋ผ๋Š” ๋ฐฐ์—ด๋„ ์„ ์–ธํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ์— ์ด์ œ K๋ฒˆ๋งŒํผ for๋ฌธ์„ ๋Œ๋ ค์„œ ๋ฐฐ์ถ”์˜ ์œ„์น˜๋ฅผ map์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

void func() {
	int M, N, K;
	int i, tmpx, tmpy;
	int map[50][50] = { 0, };
	scanf("%d %d %d", &N, &M, &K);
	for (i = 0; i < K; i++) {
		scanf("%d %d", &tmpx, &tmpy);
		map[tmpx][tmpy] = 1;
	}
	

}

์ด๋กœ์จ ์ด์ œ ๋งต์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฑด ๋์ด ๋‚ฌ๋‹ค. ์ด์ œ ๋ฌธ์ œ์˜ ํ•ต์‹ฌํฌ์ธํŠธ. ๋ญ‰์ณ์žˆ๋Š” ๋ฐฐ์ถ”์˜ ๋ฌด๋ฆฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์•ผ ํ•œ๋‹ค. 

์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ง€ ์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ, ๋จผ์ € ๊ฐ€๋กœ๋กœ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž.

 

1 1 0 

1 0 0

0 0 0

 

์ด ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž. ๋จผ์ € ์ฒซ ๋ฒˆ์งธ ์นธ์— 1์ด ๋‚˜์™”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€๋กœ๋กœ ํ•œ ์นธ ์ด๋™ํ•œ๋‹ค. ๋˜ 1์ด๋‹ค. ๋˜ ํ•œ ์นธ ์ด๋™ํ•œ๋‹ค. ์ด๋ฒˆ์—” 0์ด ๋‚˜์™”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ๋‘ ๋ฒˆ์งธ ์ค„๋กœ ๋Œ์•„์™€์„œ ์•„๋ž˜๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. 0์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ์ฒซ ๋ฒˆ์งธ ์ค„๋กœ ๋Œ์•„์˜จ๋‹ค. ์•„๋ž˜๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. 1์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์‹œ ๊ฐ€๋กœ๋กœ ํ•œ ์นธ ์ด๋™ํ•ด์„œ ๊ฒ€์‚ฌํ•œ๋‹ค. 0์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. 0์ด๋‹ค. ์˜†๊ณผ ์•„๋ž˜ ๋‘˜ ๋‹ค 0์ด ๋‚˜์™”์œผ๋ฏ€๋กœ count๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ํ•œ ์‚ฌ์ดํด์ด ๋๋‚œ๋‹ค. 

 

์ € ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ dfs๋ฅผ ์ด์šฉํ•ด์„œ ์งœ๊ฒŒ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

(0,0) --> (0,1) --> (0,2) 

(0,0) --> (0,1)

(0,0) --> (0,1) --> (1,1)

(0,0) --> (0,1)

(0,0)

 

(0,0) --> (1,0) --> (1,1)

(0,0) --> (1,0) 

(0,0) --> (1,0) --> (2,0) 

(0,0) --> (1,0)

(0,0) 

 

์ด๊ฑธ ๋ˆ„๊ฐ€ ์•Œ์•„๋ณผ๊นŒ ์‹ถ๊ธฐ๋Š” ํ•œ๋ฐ.... ์ €๋Ÿฐ์‹์œผ๋กœ ์ญ‰ ๊ฐ€๋‹ค ๋ง‰ํžˆ๋ฉด ๋Œ์•„์˜ค๊ณ  ์ญ‰ ๊ฐ€๋‹ค ๋ง‰ํžˆ๋ฉด ๋Œ์•„์˜ค๊ณ  ๊ทธ๋Ÿฐ์‹์œผ๋กœ?

 

 

๋ฌธ์ œ๋Š” ์ด์ œ ํ•˜๋‚˜๋งŒ ๊ฒ€์‚ฌํ•  ๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ๊ฑฐ์ง€. ๋งŒ์•ฝ

 

1 1 0 0 1 1

1 0 0 0 0 1

0 0 0 0 0 0

 

์ด ๊ฒฝ์šฐ๋ผ๋ฉด.. ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์ถ” ๋ฌด๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•œ ์ดํ›„์— ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

์ฒซ ๋ฒˆ์งธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งˆ์น˜๊ณ  ๋‚˜๋ฉด (0,0)์œผ๋กœ ๋Œ์•„์™€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ ๊ฒ€์‚ฌ ์‹œ์ž‘ ์ง€์ ์€..? ๋‚ด๊ฐ€ ์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ (0,0+i)์—์„œ map(0,0+i)๊ฐ€ 0์ด ๋‚˜์˜ค๋ฉด int ok ๊ฐ’์„ 1๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋‹ค์‹œ 1์ด ๋‚˜์˜ค๋ฉด ok๊ฐ’์„ 0์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋‚˜์„œ ์ € ํ–‰๋™์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ..? 

 

์•„ ์•„๋‹ˆ๋ฉด ์ €๋ ‡๊ฒŒ ํƒ์ƒ‰์„ ์™„๋ฃŒํ•œ ์ง€์ ๋“ค์˜ ๊ฐ’์„ 0์ด๋‚˜ 2๋กœ ๋ฐ”๊ฟ”์ค€ ๋‹ค์Œ, ๊ทธ๋ƒฅ ํ•œ ์  ํ•œ ์  ์ „๋ถ€ ๊ฒ€์‚ฌํ•ด๊ฐ€๋ฉฐ 1์ด ๋‚˜์˜ค๋ฉด ์ € ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

์ž ์ด์ œ ๋‡Œํ”ผ์…œ๋กœ ํ’€์—ˆ์œผ๋‹ˆ ์‹ค์ œ ์ฝ”๋”ฉ์„ ํ•˜๋Ÿฌ ๊ฐ€๋ณด๋„๋ก ํ•˜์ž.

 


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> 

int map[50][50] = { 0, };
int M, N, K;
int cnt = 0;
int end = 0; int baechu = 0;

void func();
void dfs(int x, int y);
void printmap();
int main() {
	int T;
	int i;
	scanf("%d", &T);
	
	for (i = 0; i < T; i++) {
		func();
	}
}

void func() {
	int i, tmpx, tmpy;
	cnt = 0; end = 0; baechu = 0;
	scanf("%d %d %d", &N, &M, &K);
	for (i = 0; i < K; i++) {
		scanf("%d %d", &tmpx, &tmpy);
		map[tmpx][tmpy] = 1;
	}
	dfs(0, 0);
	printf("\n%d\n", cnt);
}

void dfs(int x, int y) {
	printf("dfs(%d, %d)\n", x, y);
	printmap();	printf("\n");
	printf("cnt = %d", cnt);	printf("\n");

	if (x == N - 1 && y == N - 1) {
		end = 1;
		return;
	}

	while (!end) {
		if (map[x][y] == 0) {
			if (baechu == 0) {
				if (x == N - 1)
					dfs(0, y + 1);
				else
					dfs(x + 1, y);
			}
			if (baechu == 1) {
				return;
			}
		}

		if (map[x][y] == 1 && baechu == 0) {
			baechu = 1;	cnt++;
			if (x != N - 1)
				dfs(x + 1, y);
			dfs(x, y + 1);
			map[x][y] = 0;
			baechu = 0;
		}

		if (map[x][y] == 1 && baechu == 1) {
			if (x != N - 1)
				dfs(x + 1, y);
			dfs(x, y + 1);
			map[x][y] = 0;
		}
	}
}

void printmap() {
	int i, j;
	for (i = 0; i < M; i++) {
		for (j = 0; j < N; j++) {
			printf("%d ", map[j][i]);
		}
		printf("\n");
	}
}

์™€ ๋‚ด๊ฐ€ ์ด๊ฑธ ํ’€์—ˆ์–ด ๋Œ€๋ฐ• ๊ฐ๊ฒฉ์ ์ด์•ผ ์šฐ์™€ ๋ฌผ๋ก  ๋ฐฑ์ค€์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ์— ์ž…๋ ฅ๋ฐ›๊ณ  ๋‹ต๋‚ด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ผ€์ด์Šค๊ฐ€ ์ž˜ ๋Œ์•„๊ฐ€๋Š”์ง€ ์•„์ง ํ™•์ธ์€ ๋ชปํ•ด๋ดค์ง€๋งŒ ์ ์–ด๋„ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์ƒ˜ํ”Œ์€ ์ž˜ ๋Œ์•„๊ฐ„๋‹คใ… ใ… ใ… ใ… ใ… ๋‚ด์ผ ๋งˆ์ € ๊ณ ์น˜๊ณ  ์„ค๋ช… ์จ์•ผ๊ฒ ๊ตฐ! ! ํ–‰๋ณตํ•˜๋‹ค!