#include <iostream>
#include <queue>
 
bool visit[100001];
 
int main()
{
    int N = 0;
    int K = 0;
    int iCount = 100000;
 
    std::cin >> N >> K;
 
    std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> priQue = {};
 
    priQue.push({ 0,N });
 
    while (!priQue.empty())
    {
        std::pair<int, int> pairInt = priQue.top();
        int iTime = pairInt.first;
        int iNumber = pairInt.second;
        priQue.pop();
 
        if (iNumber == K)
        {
            std::cout << iTime;
            return 0;
        }
 
        if (iNumber * 2 < 100001)
        {
            if (!visit[iNumber * 2])
            {
                priQue.push({ iTime, iNumber * 2 });
                visit[iNumber * 2] = true;
            }
        }
 
        if (iNumber + 1 < 100001)
        {
            if (!visit[iNumber + 1])
            {
                priQue.push({ iTime + 1, iNumber + 1 });
                visit[iNumber + 1] = true;
            }
        }
 
        if (iNumber - 1 >= 0)
        {
            if (!visit[iNumber - 1])
            {
                priQue.push({ iTime + 1 , iNumber - 1 });
                visit[iNumber - 1] = true;
            }
        }
    }
 
    return 0;
}

우선순위큐는 생각해보고 사용했었는데 여기서 방문한 곳은 아예 방문 안하게 되는 것도 좀 새로웠다.

다익스트라자 알고리즘인데 여전히 잘 못 써서... 공부가 아직 모자르구나 싶다...

+ Recent posts