본문 바로가기

Problem Solving/BaekJoon

1987 알파벳

 

1987번: 알파벳

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

www.acmicpc.net

전형적인 DFS 문제이다. 리트코드에서 DFS 사용하는 문제랑 비교도 할 수 없을 정도로 단순하게 입력받아서

DFS 돌리면 된다.

 

그런데 이거 의외로 시간 복잡도가 빡빡해서 DFS 내부적으로 쓰이는 연산은 가벼운 걸로 수행해야 했었다.

그냥 아무 생각 없이 map 사용하고, 매번 map 복사하니까 바로 시간 초과가 났다...

그래서 그냥 배열 써버리고 재사용하니까 여유롭게 통과됐다.

 

C++

더보기
#include <iostream>

using namespace std;

int res{}, r, c;
pair<int, int> step[4] = { {0,1}, {0, -1}, {-1,0}, {1,0} };
string str[20];
bool check[26];

void dfs(int i, int j, int cnt) {
	check[str[i][j] - 'A'] = 1;
	if (cnt > res)
		res = cnt;
	int next_i, next_j;
	for (auto s : step) {
		next_i = i + s.first;
		next_j = j + s.second;
		if (next_i >= 0 && next_i < r && next_j >= 0 && next_j < c && !check[str[next_i][next_j] - 'A']) {
			check[str[next_i][next_j] - 'A'] = true;
			dfs(next_i, next_j, cnt + 1);
			check[str[next_i][next_j] - 'A'] = false;
		}
	}
}
int main(void)
{
	cin.tie(nullptr);
	ios_base::sync_with_stdio(false);

	cin >> r >> c;

	for (int i = 0; i < r; ++i)
		cin >> str[i];

	dfs(0, 0, 1);

	cout << res;

	return 0;
}
728x90

'Problem Solving > BaekJoon' 카테고리의 다른 글

14476 최대공약수 하나 빼기  (0) 2022.01.07
2056 작업  (0) 2021.02.06
1806 부분합  (0) 2021.02.02
2228 구간 나누기  (0) 2021.01.15
4386 별자리 만들기  (0) 2021.01.15