본문 바로가기

백준/실버

[백준 14496번] 그대, 그머가 되어 (C++)

문제링크 : https://www.acmicpc.net/problem/14496

 

14496번: 그대, 그머가 되어

첫째 줄에 머호가 바꾸려 하는 문자 a와 b가 주어진다. 둘째 줄에 전체 문자의 수 N과 치환 가능한 문자쌍의 수 M이 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ M ≤ 10,000) 이후 M개의 줄에 걸쳐 치환 가능한 문

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>

vector<int> arr[1001];
bool check[1001];

int bfs(int start, int end)
{
    queue<pii>q;
    q.push({start, 0});  //시작점과 초기 카운트 값

    while(!q.empty())
    {
        int cur = q.front().first;  //현재 문자
        int cnt = q.front().second; //현재 치환 횟수
        q.pop();

        if(cur == end)  //치환을 성공했다면
        {
            return cnt;
        }

        for(int i=0; i<arr[cur].size(); i++)
        {
            int next = arr[cur][i];  //다음 문자
            if(check[arr[cur][i]]) continue;
            check[arr[cur][i]] = true;
            q.push({next, cnt+1});  //다음 문자에 대해 탐색하며 치환 횟수 증가
        }
    }
    return -1;
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int a, b;
    cin >> a >> b;
    int N, M;
    cin >> N >> M;
    while(N--)
    {
        for(int i=0; i<M; i++)
        {
            int s, e;
            cin >> s >> e;
            arr[s].push_back(e);
            arr[e].push_back(s);
        }
    }
    
    int result = bfs(a, b);  
    cout << result;

    return 0;
}

bfs탐색을 통해 풀었다.

큐에 시작점과 치환 횟수를 같이 넘겨준다.

 

처음 문자 a가 원하는 문자 b까지 도달할때까지 치환이 몇 번이나 이루어졌는지를 검토한다.

처음 문자 a에 대해 연결된 값들을 검토하고 연결된 값들에 대해 계속해서 연결된 값들이 있는지를 확인하며 연결된 것을 확인할때 마다 치환 횟수가 1 증가한다.

최종적으로 연결된 값이 b라면 치환을 성공한 것이기에 여태까지 증가시켰던 최종 횟수를 반환하지만, 만약 최종적으로 연결된 값이 다른 값이라면 치환을 실패한 것이므로 반복문이 종료되며 -1를 반환한다.