백준 1697 BFS 풀이

Kang Joohan·2022년 1월 10일
0

algoritm/bfs

목록 보기
1/2

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

풀이 방법


한 번 방문하며 그래프를 순회하는 평범한 bfs와 달리 이 문제는 여러번 방문 할 필요가 있다. 이유는, 만약 1 2 3 4 5 6 7 8 9 10에서 1에서 4를 방문하는 최단 거리를 계산한다고 보자. 우선, 본 문제에서 주어진 걷기로만 4까지 가면 시간이 3초 걸리지만 순간이동을 통해 간다면 시간이 2초로 단축 될 것이다. 이러한 이유 때문에 bfs로 탐색을 하며 해당 좌표 값에 도달하기 까지의 시간들을 등록해가며 진행해나간다. 만약 부모 노드에서 자신의 노드까지 도달하는데 걸린 시간이 더 적다면 해당 좌표의 시간 값을 바꿔주는 식으로 진행해 나가면 된다.

코드

#include <iostream>
#include <queue>

using namespace std;

#define MAX 100001

int N, K;
int arr[MAX] {0,0};
int x[3]{1, -1, 2};

void bfs()
{ // first가 좌표 위치 2번째가 좌표의 값
    queue<int> q;
    q.push(N); //현재 위치, 0초

    while (!q.empty())
    {
        int r = q.front();

        q.pop();

        for (int i = 0; i < 3; ++i)
        {
            if (i < 2)
            {
                int nr = r + x[i]; // arr[] 좌표의 위치
                if (nr >= MAX || nr < 0)
                    continue;
                else if ((arr[nr] > arr[r] + 1) || arr[nr] == 0) 
                {
                    arr[nr] = arr[r] + 1;
                    q.push(nr);
                }
            }
            else
            {
                int nr = r * x[i];

                if (nr >= MAX || nr < 0) //부모까지 걸린 시간 + 1이 현재 자신까지 도달한 시간보다 작다면 바꿔주고 또 다시 q.push()를 해줘서 그 원소의 자식값들도 리셋해준다.
                    continue;
                else if ((arr[nr] > arr[r] + 1) || arr[nr] == 0)
                {
                    arr[nr] = arr[r] + 1;
                    q.push(nr);
                }
            }
        }
    }

    cout << arr[K] << "\n";
}

int main()
{
    cin >> N >> K;
    if(N == K)
    {
        cout << 0 << endl;
    }
    else
    {
        bfs();
    }

    return 0;
}
profile
be Gritty

0개의 댓글