백준 16928번 뱀과 사다리 게임

김두현·2022년 12월 6일
1

백준

목록 보기
35/133
post-thumbnail

🔒[문제 url]

https://www.acmicpc.net/problem/16928


🔑알고리즘

전형적인 1차원 BFS 문제이다.

  • 뱀과 사다리를 만났을 경우 어떻게 처리하는가?
    • xx에서 yy로 가는 뱀 또는 사다리를 만난 경우,
      방문 처리를 하는 지점은 xx가 아닌 yy이다.
      같은 원리이기 때문에, 뱀과 사다리를 분리해 생각할 필요는 없다.

      이외 로직은 일반 BFS와 동일하다.

🐾부분 코드

void INPUT()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= 100; i++)
    {
        visited[i] = -1;
        item[i] = i;
    }
    for (int i = 0; i < n + m; i++)
    {
        int u, v; cin >> u >> v;
        item[u] = v;
    }
}

<입력 함수>
뱀과 사다리를 굳이 분리하지 않고 하나로 입력받는다.


void BFS()
{
    queue<int> q;
    q.push(1);
    visited[1] = 0;

    while (!q.empty())
    {
        int now = q.front();
        if (now == 100) break;
        q.pop();

        for (int i = 1; i <= 6; i++)
        {
            int next = now + i;
            if (next > 100) break;
            next = item[next];

            if (visited[next] == -1)
            {
            	// 경로 길이 표기
				visited[next] = visited[now] + 1;
				q.push(next);
            }
        }
    }
}

<BFS 함수>
뱀이나 사다리를 만난 경우, 그 끝 지점에 가므로 방문처리또한 끝 지점에 한다.
주사위이므로 for문의 범위는 1i61 \leq i \leq 6 이고, 범위에 주의한다.


🪄전체 코드

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> // cpp
#include <algorithm>
// 자료 구조
#include <queue>
using namespace std;

int n, m;
int item[101];
int visited[101];

void INPUT()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= 100; i++)
    {
        visited[i] = -1;
        item[i] = i;
    }
    for (int i = 0; i < n + m; i++)
    {
        int u, v; cin >> u >> v;
        item[u] = v;
    }
}

void BFS()
{
    queue<int> q;
    q.push(1);
    visited[1] = 0;

    while (!q.empty())
    {
        int now = q.front();
        if (now == 100) break;
        q.pop();

        for (int i = 1; i <= 6; i++)
        {
            int next = now + i;
            if (next > 100) break;
            next = item[next];

            if (visited[next] == -1)
            {
            	// 경로 길이 표기
				visited[next] = visited[now] + 1;
				q.push(next);
            }
        }
    }
}

void SOLVE()
{
    BFS();
    cout << visited[100];
}



int main()
{
    INPUT();

    SOLVE();
}

🥇문제 후기

  1. 뱀과 사다리를 나누어 생각할 필요없다는 것(나눠도 되긴하지만)
  2. 뱀이나 사다리를 만날 경우 방문하는 지점은 그 끝 지점이라는 것
    두 가지만 캐치하면 간결해지는 BFS이었으나, 2번을 놓쳐 조금 헤맸던 문제.
    그러나 데이터를 쌓을 수 있어 가치있는 시간이었다.

💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM

0개의 댓글