[SWEA7699] 수지의 수지 맞는 여행
1 분 소요
[SWEA7699] 수지의 수지 맞는 여행
SWEA 7699 문제링크(로그인이 필요합니다.)
문제설명
- R*C 보드판에 알파벳이 쓰여있다.
- (0,0)에서 출발하여 보드판을 상하좌우로 움직일 때, 밟았던 알파벳 종류는 다시 안밟는다고 할 때, 지나갈 수 있는 알파벳의 최대 개수를 구하는 문제이다.
코드리뷰
- DFS로 해결하였다.
- 처음엔 방문한 곳을 확인하는 check 배열과, 밟은 알파벳 종류를 확인하는 checkalp 배열 두개를 이용해봤는데 어렵게 생각해서 시간초과가 났다.
- checkalp[board[n][m]-‘A’] 공식으로 밟은 알파벳 종류만 체크해도 방문한 곳을 확인하는 역할을 할 수 있고, 밟은 알파벳 종류또한 확인할 수 있다.
- 위 식으로 알파벳 모든 종류를 배열 인덱스로 저장한다고 해도 인덱스 수가 30이면 충분하다.
- dfs를 통해, 방문한 알파벳방 개수를 저장하며, MAX변수에 개수의 최대값을 저장하면서 해결하였다.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int R, C;
char board[25][25];
int checkalp[30];
int dr[4] = { 0,0,-1,1 };
int dc[4] = { -1,1,0,0 };
int MAX;
void dfs(int n, int m, int cnt) {
checkalp[board[n][m]-'A'] = 1;
for (int k = 0; k < 4; k++) {
int xnext = n + dr[k];
int ynext = m + dc[k];
if (checkalp[board[xnext][ynext]-'A'] == 0 && xnext >= 0 && xnext < R && ynext >= 0 && ynext < C) {
dfs(xnext, ynext, cnt + 1);
}
}
checkalp[board[n][m] - 'A'] = 0;
MAX = max(MAX, cnt);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
for (int t = 1; t <= T; t++) {
cin >> R >> C;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> board[i][j];
}
}
dfs(0, 0, 1);
cout << "#" << t << " " << MAX << "\n";
MAX = 0;
}
return 0;
}
댓글남기기