Problem Solving/Else

BOJ 1987 : 알파벳

PS리버싱마크해커박종휘TV 2022. 3. 23. 22:59

3줄요약

  • dfs
  • 백트래킹
  • 문자열

 

서론

 

이 문제는 dfs + 백트래킹의 기본형 문제라고 볼 수 있다.

 

본론

 

우리가 이 문제를 풀 때 알아야 하는 것은 한 가지 뿐이다.

  • dfs (응용)

 

어짜피 알파벳 대문자는 26개이기 때문에, dfs 완전탐색을 돌려도 되는 문제이다. (시간복잡도가 그렇게 크게 안 나온다.)

지금까지 어떤 알파벳을 체크했는지 알 수 있다면, 같은 문자가 두 개 나왔을 때 백트래킹을 할 수 있으므로, 그 방식으로 문제를 풀면 된다.

 

#include <iostream>
#include <string>

using namespace std;
#define MAXCHK (65 + 26 + 1)

int Y, X;
int graph[21][21];
bool check[MAXCHK]; // just for init

int dfs(int x, int y, bool chk[MAXCHK]) {

    if (x <= 0 || x > X || y <= 0 || y > Y) return 0;
    int idx = graph[y][x];
    if (chk[idx]) return 0;

    bool nxt[MAXCHK]; for (int i = 65; i <= 65 + 26; i++) nxt[i] = chk[i];
    nxt[idx] = true;

    return max( dfs(x + 1, y, nxt), max( dfs(x - 1, y, nxt), max( dfs(x, y + 1, nxt), dfs(x, y - 1, nxt) ) ) ) + 1;
}

int main() {
    scanf("%d %d", &Y, &X);

    for (int i = 1; i <= Y; i++) {
        string inp; cin >> inp;
        for (int j = 0; j < X; j++) {
            graph[i][j + 1] = inp[j];
        }
    }

    int ans = dfs(1, 1, check);
    cout << ans;
}

 

결론

 

 

마치 정올 1번문제를 보는 느낌이였다. 그만큼 쉬웠다...

난이도(개인적): Silver I (Up to Gold V)

난이도(객관적): Gold IV

 

다음에 풀 것: 16565번: N포커 (acmicpc.net) (Gold I)

 

 

Contact: How2Contact (tistory.com)

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

BOJ 2887 : 행성 터널  (0) 2022.03.27
BOJ 2239 : 스도쿠  (0) 2022.03.27
BOJ 13308 : 주유소  (0) 2022.03.26
BOJ 2623 : 음악프로그램  (0) 2022.03.23
BOJ 1162 : 도로포장  (0) 2022.03.21