Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 17370. ์œก๊ฐํ˜• ์šฐ๋ฆฌ ์†์˜ ๊ฐœ๋ฏธ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 17370. ์œก๊ฐํ˜• ์šฐ๋ฆฌ ์†์˜ ๊ฐœ๋ฏธ

bba_dda 2021. 8. 24. 19:45
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

 

17370๋ฒˆ: ์œก๊ฐํ˜• ์šฐ๋ฆฌ ์†์˜ ๊ฐœ๋ฏธ

๋ฌดํ•œํžˆ ๋งŽ์€ ์ •์œก๊ฐํ˜•์ด ์„œ๋กœ ๋งž๋‹ฟ์•„ ๋†“์ธ ํ˜•ํƒœ์˜ ๊ฐœ๋ฏธ ์šฐ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์ด๊ณ , ํ•˜์–€์ƒ‰ ๋ณ€์œผ๋กœ๋งŒ ๊ฐœ๋ฏธ๊ฐ€ ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฏธ ์šฐ๋ฆฌ์˜ ๋ชจ์Šต ๊ณค์ถฉ ๊ด€์ฐฐ์ด ์ทจ๋ฏธ์ธ ์œ ์ด๋Š” ์„ธ ์ •์œก๊ฐ

www.acmicpc.net

๋ฌดํ•œํžˆ ๋งŽ์€ ์ •์œก๊ฐํ˜•์ด ์„œ๋กœ ๋งž๋‹ฟ์•„ ๋†“์ธ ํ˜•ํƒœ์˜ ๊ฐœ๋ฏธ ์šฐ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์ด๊ณ , ํ•˜์–€์ƒ‰ ๋ณ€์œผ๋กœ๋งŒ ๊ฐœ๋ฏธ๊ฐ€ ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค.

๊ฐœ๋ฏธ ์šฐ๋ฆฌ์˜ ๋ชจ์Šต

๊ณค์ถฉ ๊ด€์ฐฐ์ด ์ทจ๋ฏธ์ธ ์œ ์ด๋Š” ์„ธ ์ •์œก๊ฐํ˜•์ด ์„œ๋กœ ๋งž๋‹ฟ์•„ ์žˆ๋Š” ์–ด๋–ค ์  ์œ„์— ๊ฐœ๋ฏธ๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ ธ๋‹ค. ์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ์— ์˜ฌ๋ผ์˜จ ๊ฐœ๋ฏธ๋Š” ๊ทธ ์ž์‹ ์—๊ฒŒ ๋ฏธ์ง€์˜ ์˜์—ญ์ธ ์šฐ๋ฆฌ๋ฅผ ํŽ˜๋กœ๋ชฌ์„ ๋ฟŒ๋ฆฌ๋ฉฐ ํƒ์ƒ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ฒ˜์Œ ๊ฐœ๋ฏธ๋Š” ์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์„ธ ๋ณ€ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ–ฅํ•ด ์ด๋™์„ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ด ์ฒซ ๋ฒˆ์งธ ์ด๋™์ด ๋ถ์ชฝ์„ ํ–ฅํ•˜๋„๋ก ๋Œ๋ ค์„œ ๋ณด์ž.

๋งŒ์•ฝ ๊ฐœ๋ฏธ๊ฐ€ ๋ณ€์ด ์„ธ ๊ฐˆ๋ž˜๋กœ ๊ฐˆ๋ผ์ง€๋Š” ์ ์— ๋„์ฐฉํ•˜๋ฉด, ์ž์‹ ์ด ์ด๋™ํ•ด์˜จ ๋ณ€์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋‘ ๋ณ€ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜์—ฌ ํƒ์ƒ‰์„ ๊ณ„์†ํ•œ๋‹ค.

์—ฐ๋‘์ƒ‰์€ ์‹œ์ž‘ ์ง€์ , ์ดˆ๋ก์ƒ‰์€ ๊ฐœ๋ฏธ๊ฐ€ ํƒ์ƒ‰ํ•˜๋ฉฐ ํŽ˜๋กœ๋ชฌ์„ ๋ฟŒ๋ฆฐ ๊ฒฝ๋กœ. ๊ฒ€์€์ƒ‰์€ ๊ฐœ๋ฏธ, ์ฃผํ™ฉ์ƒ‰์€ ๋‹ค์Œ ์ด๋™์„ ์œ„ํ•ด ์„ ํƒ ๊ฐ€๋Šฅํ•œ ๋‘ ๋ณ€์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ฐœ๋ฏธ๊ฐ€ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋˜, ์ฆ‰, ํŽ˜๋กœ๋ชฌ์ด ๋ฟŒ๋ ค์ง„ ์ง€์ ์— ๋„์ฐฉํ•˜๋ฉด ์ด๊ณณ์ด ์ด๋ฏธ ์ต์ˆ™ํ•œ ์˜์—ญ์ด๋ผ๋Š” ์ฐฉ๊ฐ์— ๋น ์ง€๊ณ  ๋” ์ด์ƒ์˜ ํƒ์ƒ‰์„ ๋ฉˆ์ถ˜๋‹ค. ์ด๋ ‡๊ฒŒ ํƒ์ƒ‰์„ ๋ฉˆ์ท„์„ ๋•Œ, ๋ฐฉํ–ฅ์„ ํšŒ์ „ํ•œ ํšŸ์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ N๋ฒˆ์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ณด์ž.

๋ฐฉํ–ฅ์„ 7๋ฒˆ ํšŒ์ „ํ•˜๋Š” ๋‘ ๊ฒฝ๋กœ. ํŽ˜๋กœ๋ชฌ์˜ ๊ถค์ ์€ ๋™์ผํ•ด๋„ ๊ฐœ๋ฏธ์˜ ์ด๋™ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋„๋ก ํ•œ๋‹ค.

ํ’€์ด

DFS๋ฅผ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด

์œก๊ฐํ˜• ๋ชจ์–‘์˜ ๋งต์„, ์•„๋ž˜์™€ ๊ฐ™์ด 2์ฐจ์› ๋ฐฐ์—ด์— ๋‚˜ํƒ€๋‚ด์—ˆ๋‹ค. 

ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ด ์ฒซ ๋ฒˆ์งธ ์ด๋™์ด ๋ถ์ชฝ์„ ํ–ฅํ•˜๋„๋ก ๋Œ๋ ค์„œ ๋ณด์ž. ๋ผ๊ณ  ๋ฌธ์ œ์— ๋‚˜์™€์žˆ์œผ๋ฏ€๋กœ, 

์‹œ์ž‘ํ•  ๋•Œ๋Š” ์ง์ „ ์ด๋™์ด 1๋ฒˆ์ด๋™์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  4๋ฒˆ ์ด๋™๊ณผ 2๋ฒˆ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. 

(ํ•˜์ง€๋งŒ ์ € ์ฒซ๋ฒˆ์งธ ์ด๋™์€ N์„ ์„ธ๋Š” ํšŸ์ˆ˜์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฃผ์˜) 

 

์•„๋ฌดํŠผ, ์œก๊ฐํ˜•์„ 2์ฐจ์› ๋ฐฐ์—ด์— ๋‚˜ํƒ€๋‚ด๊ณ , 

์ง์ „ ์ด๋™์— ๋”ฐ๋ผ ๋‹ค์Œ์— ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด๋†“๊ณ  ์‚ฌ์šฉํ•ด์„œ DFS๋ฅผ ๋Œ๋ ธ๋‹ค. 

 

DFS๋ฅผ ๋Œ๋ฆฌ๋‹ค๊ฐ€ ์ด๋™ํšŸ์ˆ˜๊ฐ€ N์ธ๋ฐ, ์ง์ „์— ๋ฐฉ๋ฌธํ•œ ์œ„์น˜์ด๋ฉด ๋‹ต์„ +1 ํ•ด์ฃผ์—ˆ๋‹ค. 

 

N์˜ ์ตœ๋Œ“๊ฐ’์ด 22์ด๋ฏ€๋กœ, ๋งต์˜ ํฌ๊ธฐ๋Š” ๋Œ€๊ฐ• 101์œผ๋กœ ํ•ด์ฃผ๊ณ 

(50,50)์—์„œ (49,50)์œผ๋กœ ์ฒซ๋ฒˆ์งธ ์ด๋™์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ•ด๋‹น ์œ„์น˜์—์„œ DFS๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. 

์ฝ”๋“œ

#include <iostream>

using namespace std;

int N;
bool visited[101][101];

int answer = 0;

//last =>  0:↑, 1:↓, 2:โ†—, 3:โ†™, 4:โ†–, 5:โ†˜
int route[6][2][2] = { {{-1,-1},{-1,1}}, {{1,-1},{1,1}}, {{-1,0},{1,1}}, {{1,0},{-1,-1}}, {{1,-1},{-1,0}}, {{-1,1},{1,0}} };
int lasts[6][2] = { {4, 2}, {3, 5}, {0, 5}, {1, 4}, {3, 0}, {2, 1} };


void DFS(int r, int c, int count, int last) {

	for (int i = 0;i < 2;i++) {
		int dr = route[last][i][0];
		int dc = route[last][i][1];
		int now = lasts[last][i];

		int nextR = r + dr;
		int nextC = c + dc;

		if (count + 1 == N) {
			if (visited[nextR][nextC]) answer++;
			continue;
		}
		if (!visited[nextR][nextC]) {
			visited[nextR][nextC] = 1;
			DFS(nextR, nextC, count + 1, now);
			visited[nextR][nextC] = 0;
		}
		
	}
}
int main() {
	ios::sync_with_stdio(false); cin.tie(NULL);
	cin >> N;

	//0 ๋ฒˆ์งธ ์ด๋™ 50,50 -> 49,50
	visited[50][50] = 1;
	visited[49][50] = 1;
	DFS(49, 50, 0, 0);
	
	cout << answer << endl;
	return 0;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•