• toc {:toc}

📦16928: 뱀과 사다리 게임


[알고리즘 풀이] 강동규
Reviewed by Kade Kang (devkade12@gmail.com)
Reviewed:: 2024-02-06
문제 확인하기

풀이

알고리즘 풀이를 검색해보면서 얍문님이 푸시는 틀처럼 나누어서 코드를 짜봤는데 명시적으로 나누니 빼뜨리지 않고 생각할 수 있어서 연습하기 좋은 것 같다. 당분간은 이렇게 유지해봐야겠다.

  • 최솟값을 구하는 것이기 때문에 BFS로 풀이하고 가장 먼저 답이 나오면 중단하는 방식을 사용했다.
  • 1~6까지의 숫자를 더하고 방문 체크, 방문하지 않았다면 이동해서 방문 처리를 한다. 이때 사다리, 뱀으로 연결되어 있다면 사다리, 뱀을 통해 이동한 후에 방문 체크하는 것이 아닌, 이동 전에 방문 체크를 한다.
  • 주의할 점은 1~6 주사위를 반복해서 던질 때 중복되어 주사위나 이전 값이 더해지는 경우는 없는 지를 체크해야 한다.
#include <iostream>
#include <vector>
#include <queue>
#define endl '\n';
using namespace std;
 
int snake[101];
int ladder[101];
int vis[101];
int n, m;
queue<pair<int, int>> q;
 
void Input(){
    cin >> n >> m;
 
    int val;
    for(int i=0; i<n; i++){
        cin >> val;
        cin >> ladder[val];
    }
    for(int i=0; i<m; i++){
        cin >> val;
        cin >> snake[val];
    }
}
 
int game(){
    int start = 1;
    vis[start] = 1;
    q.push({0, start});
 
    int prev_roll, prev;
    while(!q.empty()){
        auto info = q.front(); q.pop(); 
        prev_roll = info.first;
        prev = info.second;
        if(prev == 100) return prev_roll;
        for(int i=1; i<=6; i++){
            int cur = prev + i;
            int cur_roll = prev_roll + 1;
            if(vis[cur] == 1 || cur > 100 || cur < 1) continue;
            
            vis[cur] = 1;
            if(ladder[cur] != 0){
                cur = ladder[cur];
            }
            else if(snake[cur] != 0){
                cur = snake[cur];
            }
            q.push({cur_roll, cur});
        }
    }
}
 
void Solution(){
    cout << game() << endl;
}
 
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    Input();
    Solution();
 
    return 0;
}