[BOJ-Code] 1987 - 알파벳

Posted by DHniyeo Blog on March 10, 2024

문제 링크

💡 백트래킹/깊이 우선 탐색/그래프 이론/그래프 탐색

Memory 2020KB Time 544ms Code Length 813B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>

int R, C;
char map[20][21];
int visited[255];
int dy[] = { -1,1,0,0 };
int dx[] = { 0,0,-1,1 };
int max = 0;
void dfs(int y, int x, int cnt) {
	int way = 4;
	for (int i = 0; i < 4; i++) {
		int ny = y + dy[i];
		int nx = x + dx[i];
		if (ny >= R || nx >= C || ny < 0 || nx < 0 || visited[map[ny][nx]]) way--;
	}
	if (way == 0) {
		if (max < cnt) {
			max = cnt;
		}
		return;
	}
	for (int i = 0; i < 4; i++) {
		int ny = y + dy[i];
		int nx = x + dx[i];
		if (ny >= R || nx >= C || ny < 0 || nx < 0) continue;
		if (visited[map[ny][nx]]) continue;
		visited[map[ny][nx]] = 1;
		dfs(ny, nx, cnt + 1);
		visited[map[ny][nx]] = 0;
	}
}
int main() {
	scanf("%d %d", &R, &C);
	for (int i = 0; i < R; i++) {
		scanf(" %s", &map[i]);
	}
	visited[map[0][0]] = 1;
	dfs(0,0, 1);

	printf("%d\n", max);
}

이 코드는 입력으로 받은 지도에서 상하좌우로 이동하면서 최대한 많은 칸을 방문하는 DFS(깊이 우선 탐색) 알고리즘을 구현한 것이다.

  • 먼저 입력으로 받은 지도의 크기와 내용을 저장한다.
  • 방문한 칸을 체크하기 위한 visited 배열을 초기화한다.
  • 상하좌우로 이동하는 방향을 나타내는 dy, dx 배열을 설정한다.
  • dfs 함수는 현재 위치와 방문한 칸의 수를 인자로 받는다.
  • 주어진 위치에서 상하좌우로 이동할 수 있는지 확인하고, 이동할 수 있는 방향의 수를 계산한다.
  • 만약 이동할 수 있는 방향이 없다면, 현재까지 방문한 칸의 수를 최대값과 비교하여 갱신한다.
  • 이동할 수 있는 방향이 있다면, 각 방향으로 이동하고 해당 칸을 방문했음을 표시한 뒤, 재귀적으로 dfs 함수를 호출한다.
  • 모든 경우의 수를 탐색한 후, 최대 방문 칸 수를 출력한다.