본문 바로가기
PS

[BAEKJOON] 1987 알파벳 (C++)

by bin1225 2023. 7. 13.

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

 

1987번: 알파벳

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

www.acmicpc.net

문제

 

풀이

가려는 칸이 이미 밟았던 알파벳인지 확인하며 지날 수 있는 최대 칸 수를 구해야 한다.

밟았던 알파벳인지에 대한 기록을 유지한다. 최대 길이를 구한다.

-> DFS임을 알 수 있다.

 

check 배열을 이용해 check[알파벳-'A']로 방문 여부를 체크했다.

일반적인 dfs방식이지만 이미 방문한 알파벳인 칸은 방문할 수 없다.

방문가능하다면 해당 문자칸을 방문했다는 체크를 check배열에 해주고 방문한다.

방문을 마쳤다면 다시 check를 해제해준다.

여기서 방문을 마쳤다는 의미는 해당 칸에서 가능한 부분을 모두 탐색한 경우이다.

 

코드

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

#define endl "\n"

using namespace std;

int R,C, ans;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
bool check[26];
char MAP[21][21];
void Input() {
	cin >> R >> C;
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cin >> MAP[i][j];
		}
	}
}

void dfs(int y, int x, int cnt) {
	int xx, yy;
	ans = max(ans, cnt);
	
	for (int i = 0; i < 4; i++) {
		xx = x + dx[i]; yy = y + dy[i];
		if (xx<0 || xx>=C || yy<0 || yy>=R) continue;
		if (check[MAP[yy][xx]-'A'] == 0) {
			check[MAP[yy][xx] - 'A'] = 1;
			dfs(yy, xx, cnt + 1);
			check[MAP[yy][xx] - 'A'] = 0;
		}
	}
}

void Solve() {

	check[MAP[0][0]- 'A'] = 1;
	dfs(0, 0, 1);

	cout << ans;
}


int main() {
	ios::sync_with_stdio(false); cin.tie(NULL);
	freopen("input.txt", "r", stdin);
	Input();
	Solve();
	return 0;
}

'PS' 카테고리의 다른 글

[BAEKJOON] 1937 욕심쟁이 판다 (C++)  (0) 2023.07.17
[BAEKJOON] 5430 AC (C++)  (0) 2023.07.14
[BAEKJOON] 2011 암호코드 (C++)  (0) 2023.07.11
[프로그래머스] 조이스틱 (C++)  (1) 2023.07.11
[BAEKJOON] 1918 후위 표기식 (C++)  (0) 2023.07.10