기타/백준일지

[백준] 1697번 숨바꼭질

민지기il 2025. 1. 21. 18:39
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
#define MAX 100001
typedef long long ll;
using namespace std;

//BFS 계산
int N,K;
int visited[MAX] ={}; //정점 방문, 걸린 시간 저장

int bfs(){
    queue<int> q; //현재 위치에서 이동 가능한 다음 위치 저장
    q.push(N); //시작 위치
    visited[N]=0;
    while(!q.empty()){
        int nowPosition = q.front();
        q.pop();
        
        if(nowPosition == K) break;
        
        int minusPosition = nowPosition-1;
        int plusPosition = nowPosition+1;
        int multiPosition = nowPosition*2;
        
        if(minusPosition >=0 && visited[minusPosition] ==0){ //방문하지 않았으면
            q.push(minusPosition);
            visited[minusPosition] = visited[nowPosition] +1; //방문 시간 기록
        }
        if(plusPosition < MAX && visited[plusPosition]==0){
            q.push(plusPosition);
            visited[plusPosition] = visited[nowPosition] +1;
        }
        if(multiPosition < MAX && visited[multiPosition] ==0){
            q.push(multiPosition);
            visited[multiPosition] = visited[nowPosition] +1;
        }
    }
    return visited[K];
}

int main(){
    cin>>N>>K;
    cout<<bfs();
    return 0;
}

<풀이>

+1, -1, *2를 모두 탐색하는 BFS 알고리즘이다.

Q. N=5, K=17이라고 하자

N=5에서 시작; 이동 가능한 위치: 4,6,10 -> 방문하지 않았으므로 큐[4, 6, 10] ;

visited[4]=visited[5]+1=1, visited[6]=1, visited[10]=1

N=4로 이동; 이동 가능한 위치: 3,5,8 -> 큐[6, 10, 3, 8] ; visited[3]=visited[4]+1=2, visited[8]=2

N=6로 이동; 이동 가능한 위치: 5,7,12 -> 큐[10, 3, 8, 7, 12]; visited[7]=visited[6]+1=2, visited[12]=visited[6]+1=2

반복해서 visited[K=17]에 도달하면 종료함, 그때의 값이 최소시간임

 

<참고 사이트>

https://animoto1.tistory.com/entry/%EB%B0%B1%EC%A4%80-1697-%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88-C