알고리즘/알고리즘 문제

[백준] 1987 알파벳 - C++

천니 2021. 10. 20. 19:36
728x90

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

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

 

DFS 와 관련된 문제를 풀다가 알파벳 문제를 풀었다.

 

A~Z 가 26개라는 개념을 알면 쉽게 풀리는 문제였다.

 

골드 4 문제치고 쉬운 문제지만 시간복잡도 관련하여 정리하고 싶어 글을 작성한다. 

 

백준 내리막길 문제 (1520) 과 굉장히 유사한 문제이다. 내리막길 문제는 DFS 로 문제를 풀려다가 시간 초과의 장벽을 넘어서지 못했다.... 이 이유가 이 문제와 굉장히 유사한 것 같았다.  (내리막길 문제는 시간 복잡도가 O(4^500*500)이라서 단순 DFS로는 절대 못풀어서 혹시 알파벳 문제도 못푸나? 생각을 하였다. )

 

알파벳 문제의 시간 복잡도는 알파벳 26 개 이므로 O(4^26)이다. 얼핏보면 연산횟수 10억을 넘는 것 같지만 왔던 길은 가지 않고 지나갔던 알파벳은 안가도 되므로 사실상 4^26의 연산이 아니라서 시간 초과가 뜨지 않아서 DFS 로 풀어도 되는 듯 하였다.

 

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

using namespace std;

int graph[20][20];
bool visited[26];
int R, C;
int max_ans = 0;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };


void dfs(int x, int y, int count) {

	max_ans = max(max_ans, count);
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];

		if (nx < 0 || ny < 0 || nx >= R || ny >= C|| visited[graph[nx][ny]]==true) {
			continue;
		}
		visited[graph[nx][ny]] = true;
		dfs(nx, ny, count + 1);
		visited[graph[nx][ny]] = false;
	}
}

int main() {
	
	cin >> R >> C;

	for (int i = 0; i < R; i++) {
		string s;
		cin >> s;
		for (int j = 0; j < C; j++) {
			graph[i][j] = s[j] - 'A';
		}
	}

	visited[graph[0][0]] = true;
	dfs(0, 0, 1);

	cout << max_ans;
}