๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 1697 : ์ˆจ๋ฐ”๊ผญ์งˆ (BFS)

by xxilliant 2023. 2. 23.
728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  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);
}

 

728x90
๋ฐ˜์‘ํ˜•