Baekjoon1987-알파벳
백준 사이트 1987 - 알파벳 문제입니다.
1. 문제
https://www.acmicpc.net/problem/1987
2. Input , Output
3. 분류 및 난이도
DFS문제입니다.
BFS로는 풀기 어렵다고 생각합니다. 이유는 밑에 쓰겠습니다.
백준에서는 Gold4 난이도를 책정하고 있습니다.
4. 생각한 것들
- 삽질을 엄청 많이한 문제입니다.
- BFS로 풀어볼까?
- BFS는 자신이 있으니까 BFS로 구현해볼까 했습니다. 실제로 ‘치즈’ 문제도 DFS로 분류되어 있지만 BFS 풀었기 때문입니다. BFS로 풀기 힘든 이유는 너비 탐색 조건을 까다롭게 하기 때문입니다. 당장 첫 예제만 봐도 0,1과 1,0이 ‘A’라서 방문처리를 풀어줘야하는데 그 부분에서 어려움이 있습니다.
- DFS로 풀어야하는 것은 맞는데, 인자로 count를 넘길까?
- 저는 인자를 많이 쓰는 것을 싫어해서.. 왜그런지 모르겠지만 2차원 DP를 만들어서 결과값들을 저장했습니다. 이 부분에서 엄청 애 썼는데 왠지 몰라도 오류가 많이 발생했습니다. 똥고집으로 해결하고 싶어서 30분 이상 썼습니다.
- 포기하고 인자로 count값을 넘기자. -> 해결
5. code
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
#include<cstring>
using namespace std;
const int MAX = 22;
int r, c;
int result = 1;
char MAP[MAX][MAX] = { '0', };
bool check[30] = { false, };
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1};
void DFS(int i, int j,int count)
{
result = max(result, count);
check[MAP[i][j] - 65] = true;
for (int k = 0; k < 4; ++k)
{
int newX = i + dx[k];
int newY = j + dy[k];
if (0 <= newX && newX < r && 0 <= newY && newY < c && !check[MAP[newX][newY]-65])
{
DFS(newX, newY,count+1);
check[MAP[newX][newY] - 65] = false;
}
}
}
void Input()
{
cin >> r >> c;
for (int i = 0; i < r; ++i)
{
cin>>MAP[i];
}
}
void Solve()
{
memset(check, false, sizeof(check));
DFS(0, 0,1);
cout << result;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
Input();
Solve();
}
6. 후기
풀고 나니 어렵진 않은데 시간을 너무 써서 찝찝한 문제..
This post is licensed under CC BY 4.0 by the author.