λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“ μ•Œκ³ λ¦¬μ¦˜/BOJ

[C++/BOJ] 1697 : μˆ¨λ°”κΌ­μ§ˆ (BFS)

문제

μˆ˜λΉˆμ΄λŠ” 동생과 μˆ¨λ°”κΌ­μ§ˆμ„ ν•˜κ³  μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” ν˜„μž¬ 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” κ±·κ±°λ‚˜ μˆœκ°„μ΄λ™μ„ ν•  수 μžˆλ‹€. λ§Œμ•½, 수빈이의 μœ„μΉ˜κ°€ X일 λ•Œ κ±·λŠ”λ‹€λ©΄ 1초 후에 X-1 λ˜λŠ” X+1둜 μ΄λ™ν•˜κ²Œ λœλ‹€. μˆœκ°„μ΄λ™μ„ ν•˜λŠ” κ²½μš°μ—λŠ” 1초 후에 2*X의 μœ„μΉ˜λ‘œ μ΄λ™ν•˜κ²Œ λœλ‹€.

μˆ˜λΉˆμ΄μ™€ λ™μƒμ˜ μœ„μΉ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μˆ˜λΉˆμ΄κ°€ 동생을 찾을 수 μžˆλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ΄ λͺ‡ 초 후인지 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫 번째 쀄에 μˆ˜λΉˆμ΄κ°€ μžˆλŠ” μœ„μΉ˜ Nκ³Ό 동생이 μžˆλŠ” μœ„μΉ˜ Kκ°€ 주어진닀. Nκ³Ό KλŠ” μ •μˆ˜μ΄λ‹€.

좜λ ₯

μˆ˜λΉˆμ΄κ°€ 동생을 μ°ΎλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ„ 좜λ ₯ν•œλ‹€.

힌트

μˆ˜λΉˆμ΄κ°€ 5-10-9-18-17 순으둜 κ°€λ©΄ 4μ΄ˆλ§Œμ— 동생을 찾을 수 μžˆλ‹€.

 


 

λ°±μ€€ 싀버1.

 

1. dfs인쀄 μ•Œκ³  μ—΄μ‹¬νžˆ ν’€λ‹€κ°€ μž¬κ·€κ°€ 계속 ν„°μ Έμ„œ 이상함을 λŠλ‚Œ

2. bfs둜 ν’€μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμ˜€μŒ ^^.....

3. 잘 ν’€μ—ˆλ‹€κ³  μƒκ°ν–ˆλŠ”λ° μ œμΆœν•˜λ‹ˆ OutOfBoundsκ°€ 떠버림

4. 질문 κ²Œμ‹œνŒμ— λ‚˜λž‘ λ˜‘κ°™μ€ μ‚¬λžŒμ΄ μžˆμ—ˆμŒ. 휴~

 

탐색 μ²΄ν¬ν• λ•Œ λ²”μœ„ 체크 λ¨Όμ € ν•˜κ³ λ‚˜μ„œ visited ν–ˆλŠ”μ§€ 체크해야 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•ŠμŒ!

 

κΈ°μ–΅ν•˜μž. μ‘°κ±΄λ”°μ§ˆλ•Œ λ²”μœ„ 체크가 μš°μ„ μ΄λ‹€!!!

 

 

 

λ‚˜μ˜ 풀이

#include <iostream>
#include <queue>
using namespace std;

int n;
int k;
int visited[100002]={0,};

bool canGo(int num){
    if(num<0 || num>100000) return false; // λ²”μœ„κ²€μ‚¬ λ¨Όμ € ν•΄μ•Ό outofboundsκ°€ λœ¨μ§€ μ•ŠμŒ
    if(visited[num]==1) return false;
    return true;
}

void bfs(int i){
    int dist[100002] = {0,};
    queue<int> q;
    q.push(n);
    visited[n] = 1;
    while(!q.empty()){
        int a = q.front();
        q.pop();
        if(canGo(a+1)){
            q.push(a + 1);
            visited[a + 1] = 1;
            dist[a + 1] = dist[a] + 1;
        }
        if(canGo(a-1)){
            q.push(a - 1);
            visited[a - 1] = 1;
            dist[a - 1] = dist[a] + 1;
        }
        if(canGo(a*2)){
            q.push(a * 2);
            visited[a * 2] = 1;
            dist[a * 2] = dist[a] + 1;
        }
    }
    cout << dist[k];
    return;
}

int main(){
    cin >> n >> k;
    bfs(n);
}