Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1987. ์•ŒํŒŒ๋ฒณ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1987. ์•ŒํŒŒ๋ฒณ

bba_dda 2021. 5. 4. 23:09
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

www.acmicpc.net/problem/1987

 

1987๋ฒˆ: ์•ŒํŒŒ๋ฒณ

์„ธ๋กœ R์นธ, ๊ฐ€๋กœ C์นธ์œผ๋กœ ๋œ ํ‘œ ๋ชจ์–‘์˜ ๋ณด๋“œ๊ฐ€ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ๊ฐ ์นธ์—๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜์”ฉ ์ ํ˜€ ์žˆ๊ณ , ์ขŒ์ธก ์ƒ๋‹จ ์นธ (1ํ–‰ 1์—ด) ์—๋Š” ๋ง์ด ๋†“์—ฌ ์žˆ๋‹ค. ๋ง์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘์˜ ํ•œ ์นธ์œผ

www.acmicpc.net

์„ธ๋กœ R์นธ, ๊ฐ€๋กœ C์นธ์œผ๋กœ ๋œ ํ‘œ ๋ชจ์–‘์˜ ๋ณด๋“œ๊ฐ€ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ๊ฐ ์นธ์—๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜์”ฉ ์ ํ˜€ ์žˆ๊ณ , ์ขŒ์ธก ์ƒ๋‹จ ์นธ (1ํ–‰ 1์—ด) ์—๋Š” ๋ง์ด ๋†“์—ฌ ์žˆ๋‹ค.

๋ง์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘์˜ ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒˆ๋กœ ์ด๋™ํ•œ ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ง€๋‚˜์˜จ ๋ชจ๋“  ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ๊ณผ๋Š” ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์ ํžŒ ์นธ์„ ๋‘ ๋ฒˆ ์ง€๋‚  ์ˆ˜ ์—†๋‹ค.

์ขŒ์ธก ์ƒ๋‹จ์—์„œ ์‹œ์ž‘ํ•ด์„œ, ๋ง์ด ์ตœ๋Œ€ํ•œ ๋ช‡ ์นธ์„ ์ง€๋‚  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ง์ด ์ง€๋‚˜๋Š” ์นธ์€ ์ขŒ์ธก ์ƒ๋‹จ์˜ ์นธ๋„ ํฌํ•จ๋œ๋‹ค.

ํ’€์ด

DFS๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค!

๋ณดํ†ต DFS๋ฅผ ์ด์šฉํ•  ๋•Œ, ์ „์ฒด table๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์˜ visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ํ•ด๋‹น ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜์ง€๋งŒ, ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” ์•ŒํŒŒ๋ฒณ ํฌ๊ธฐ์˜ visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ, ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ์ด ์“ฐ์—ฌ์žˆ๋Š” ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. 

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int R, C;
char table[21][21];

int dc[4] = { -1,0,1,0 };
int dr[4] = { 0,-1,0,1 };
int maxCount = 1; //์‹œ์ž‘์ ์€ ๋ฌด์กฐ๊ฑด ์ง€๋‚˜๋Š” ๊ฒƒ์œผ๋กœ ํ•˜๊ธฐ๋•Œ๋ฌธ์— 1๋กœ ์ดˆ๊ธฐํ™” 
int cnt = 1;

void DFS(bool visited[], int r, int c) {
	char temp  = table[r][c];
	visited[temp - 'A'] = true;

	for (int i = 0;i < 4;i++) {
		int new_c = c + dc[i];
		int new_r = r + dr[i];

		if (-1 < new_c && -1 < new_r && C > new_c && R > new_r) {
			char next = table[new_r][new_c];

			if (!visited[next - 'A']) { //์ง€๋‚˜๊ฐ„ ์ ์ด ์—†๋Š” ์•ŒํŒŒ๋ฒณ์ด๋ฉด! 
				maxCount = max(maxCount, ++cnt);
				DFS(visited, new_r, new_c);
				--cnt;
			}
		}
	}
	visited[temp - 'A'] = false;
}
int main(void) {
	cin >> R >> C;
	for (int r = 0;r < R;r++) {
		for (int c = 0;c < C;c++) {
			cin >> table[r][c];
		}
	}

	bool visited[26] = { 0, };
	DFS(visited, 0, 0);
	cout << maxCount << endl;
	return 0;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•