백준 1697 숨바꼭질

hyoJeong·2021년 5월 14일
0

백준 1697 숨바꼭질이라는 문제를 풀어보았습니다.
문제링크:https://www.acmicpc.net/problem/1697
처음에는 dp 로 풀어보려고 하다가 계속 틀렸다고 오류가 떠.. bfs로 변경해 풀었습니다.
dp풀이는 나중에 풀고, 다시 추가해 보도록 하겠습니다
bfs로 생각한 이유는 수빈이가 동생을 찾을수 있는 가장 빠른시간이 몇초인지 구하는 문제였기 때문입니다.
갈수 있는 모든 경우를 생각해, 수빈이가 동생이 있는 위치로 처음 갔을경우, 해당시간이 동생을 빨리 찾을 수 있는 최단 시간이기 때문입니다.

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

int n,k;
int cur;
int cnt;

int ch[300002];

//수빈이의 위치 값과, 시간 값을 표현하기 위해
queue<pair<int,int>>q;
void bfs(int l,int c){
      
    q.push({l,c});
    while(!q.empty()){
        //수빈이 위치
        cur=q.front().first;
        
        //수빈이가 이동한 시간 초
        cnt=q.front().second;
        q.pop();
        if(cur==k){
            cout<<cnt<<"\n";
            break;
        }
        //앞으로 간적이 없을때
        if(ch[cur+1]==0){
            ch[cur+1]=1;
            q.push({cur+1,cnt+1});
        }
        //범위 초과 막기 위해
        if(cur-1>=0){
            //방문전
            if(ch[cur-1]==0){
                ch[cur-1]=1;
                q.push({cur-1,cnt+1});
            }
        }
        //범위 초과 막기위해
        if(cur*2<300002){
            if(ch[cur*2]==0){
                ch[cur*2]=1;
                q.push({cur*2,cnt+1});
            }
        }
       
        
        
    }
    
    
}


int main(){
    
    
    cin.tie(0);
    cout.tie(0);
    std::ios::sync_with_stdio(false);
    
    cin>>n>>k;
    
    bfs(n,0);
    
    
    
    
    
    
    return 0;
}

ch라는 배열을 만든 이유는 한번 간 위치는 다시 가지 않기 위해 사용됩니다.
코드를 보다, 이해가 안가는 부분이 있다면 자유롭게 댓글 달아주세요!!!
읽어주셔서 감사합니다 😊

0개의 댓글