본문 바로가기
알고리즘/백준 BOJ

[ BOJ/C# ] 1697 숨바꼭질

by 왹져박사 2023. 10. 24.

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

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

BFS 문제이다. 

많이 접해오던 BFS 문제와는 다르게 2차원배열로 이루어지지 않았다. 

문제에서 주어진 3가지의 경우로 최소 시간을 구해야 한다. 

x-1, x+1, x*2의 가능 조건들을 설정한다. 

주의해야 할 점은, x*2의 값이 K+1일 경우 x-1로 K를 만들어주는 경우도 있기 때문에 범위를 K+1로 설정해주어야 한다. 

이 부분을 간과하여 처음에 틀렸다. 

using System;
using System.IO;

namespace B1697
{
    class Program
    {
        static int N, K;
        static Queue<(int, int)> q = new Queue<(int, int)>();
        static bool[] visited = new bool[100001];
        static int Min = 0;

        static void BFS()
        {
            q.Enqueue((N, 0));
            visited[N] = true;
            while(q.Count > 0)
            {
                var deq = q.Dequeue();
                int deqx = deq.Item1;
                int time = deq.Item2;
                //목표에 도달했다면 Min과 비교
                if (deqx == K)
                {
                    if (Min == 0) Min = time;   //Min에 저장된 값이 없다면 새로 저장
                    else if (Min > time) Min = time;    //Min보다 작다면 저장
                }
                //경우의 수들 q에 저장
                if (deqx + 1 <= K && visited[deqx + 1] == false)
                {
                    q.Enqueue((deqx + 1, time + 1));
                    visited[deqx + 1] = true;
                }
                if (deqx - 1 >= 0 && visited[deqx - 1] == false)
                {
                    q.Enqueue((deqx - 1, time + 1));
                    visited[deqx - 1] = true;
                }
                if (deqx * 2 <= K + 1 && visited[deqx * 2] == false)
                {
                    q.Enqueue((deqx * 2, time + 1));
                    visited[deqx * 2] = true;
                }
            }
        }
        static void Main()
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

            int[] nk = Array.ConvertAll(sr.ReadLine().Split(' '), int.Parse);
            N = nk[0];
            K = nk[1];

            BFS();
            sw.Write(Min);
            sr.Close();
            sw.Flush();
            sw.Close();
        }
    }
}

'알고리즘 > 백준 BOJ' 카테고리의 다른 글

[ BOJ/C# ] 18110 solved.ac  (0) 2023.10.25
[ BOJ/C# ] 16928 뱀과 사다리 게임  (0) 2023.10.24
[ BOJ/C# ] 1654 랜선 자르기  (0) 2023.10.23
[ BOJ/C# ] 1436 영화감독 숌  (0) 2023.10.22
[ BOJ/C# ] 1966 프린터 큐  (0) 2023.10.21