๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS

[BOJ G5][C++] ๋ฐฑ์ค€ 13549๋ฒˆ : ์ˆจ๋ฐ”๊ผญ์งˆ 3 (๋Ÿฐํƒ€์ž„์—๋Ÿฌ์™€์˜์ „์Ÿ)

์„ ๋‹ฌ 2022. 4. 16. 21:06
๋ฐ˜์‘ํ˜•

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

 

13549๋ฒˆ: ์ˆจ๋ฐ”๊ผญ์งˆ 3

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  N(0 ≤ N ≤ 100,000)์— ์žˆ๊ณ , ๋™์ƒ์€ ์  K(0 ≤ K ≤ 100,000)์— ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๊ฐ€ X์ผ

www.acmicpc.net

 

๋ฌธ์ œ

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  N(0 ≤ N ≤ 100,000)์— ์žˆ๊ณ , ๋™์ƒ์€ ์  K(0 ≤ K ≤ 100,000)์— ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๊ฐ€ X์ผ ๋•Œ ๊ฑท๋Š”๋‹ค๋ฉด 1์ดˆ ํ›„์— X-1 ๋˜๋Š” X+1๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ์ˆœ๊ฐ„์ด๋™์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” 0์ดˆ ํ›„์— 2*X์˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

์ˆ˜๋นˆ์ด์™€ ๋™์ƒ์˜ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ ํ›„์ธ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ˆ˜๋นˆ์ด๊ฐ€ ์žˆ๋Š” ์œ„์น˜ N๊ณผ ๋™์ƒ์ด ์žˆ๋Š” ์œ„์น˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N๊ณผ K๋Š” ์ •์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

BFS ๋ฅผ ์ผ์ฐจ์› ๋ฒ„์ „์œผ๋กœ ๋Œ๋ฆฌ๋Š”๊ฑฐ๋ผ๋Š” ์ ์€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

๋‹ค๋งŒ ์œ„์— ์‹œํ–‰์ฐฉ์˜ค์ฒ˜๋Ÿผ ์ •๋‹ต์ด ์ตœ์†Ÿ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์šฐ์„ ์ˆœ์œ„๋งŒ ์ž˜ ์„ค์ •ํ•ด์ฃผ์ž

 

// Authored by : seondal
// ํ’€์ด : https://whkakrkr.tistory.com/
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <queue>

using namespace std;

int n,k;
int dis[200002];
queue<int> q;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    for(int i=0; i<200000; i++) dis[i] = -1;
    
    cin >> n >> k;
    q.push(n);
    dis[n] = 0;
    
    while(!q.empty()) {
        int cur = q.front();
        q.pop();
        
        // ์ˆœ๊ฐ„์ด๋™
        if(cur*2 < 200000 and dis[cur*2] == -1) {
            dis[cur*2] = dis[cur];
            q.push(cur*2);
        }
        
        for(int i=0; i<2; i++){
            int next=0;

            if(i==0) next = cur-1;
            else if(i==1) next = cur+1;

            if(next<0 or next>=200000) continue;
            if(dis[next] != -1) continue;

            dis[next] = dis[cur]+1;
            q.push(next);
        }
    }
    
    cout << dis[k];
}

/*
 */

 


์‹œํ–‰์ฐฉ์˜ค

์ฒ˜์Œ์—๋Š” BFS ๋ฅผ 1์ฐจ์› ์ˆ˜์ง์„ ์œผ๋กœ ๋Œ๋ฆฌ๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜ ํ•˜๊ณ  ํŽธํ•˜๊ฒŒ ํ’€์—ˆ๋‹ค.

    while(!q.empty()){
        int cur = q.front();
        q.pop();
        
        for(int dir=0; dir<3; dir++){
            int next;
            if(dir==0) next = cur+1;
            else if(dir==1) next = cur-1;
            else next = cur*2;
            
            // ๋‹ต์ด ๋‚˜์™”๋‹ค!
            if(next==k) {
                cout << dis[cur]+1;
                return 0;
            }
            
            if(next<0 || next>=200002) continue; // ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„ฐ๋‹ค๋ฉด
            if(dis[next] != -1) continue;  // ์ด๋ฏธ ๋ฐฉ๋ฌธ ํ–ˆ๋‹ค๋ฉด

            if(dir==2) dis[next] = dis[cur]; // ์ˆœ๊ฐ„์ด๋™
            else dis[next] = dis[cur] + 1;  // ๊ฑท๊ธฐ
            
            q.push(next);
        }
        }

๊ทธ๋Ÿฐ๋ฐ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๊ฐ€ ๋œจ๋Š”๊ฒƒ์ด๋‹ค..

 

๊ทธ๋Ÿฐ๋ฐ ์ •๋ง ์šด์ข‹๊ฒŒ๋„ ๋”ฑ ๋‚ด ๋ฌธ์ œ์ ์„ ์งš์–ด์ฃผ๋Š” ์งˆ์˜์‘๋‹ต ์ด ์žˆ์—ˆ๋‹ค.

https://www.acmicpc.net/board/view/81912

 

๊ธ€ ์ฝ๊ธฐ - ์–ด๋Š๋ถ€๋ถ„์—์„œ ํ‹€๋ฆฐ๊ฑด์ง€ ๋„์ €ํžˆ ์ฐพ์ง€ ๋ชปํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค..

๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

www.acmicpc.net

 

๋ฐ˜๋ก€

4 6

์˜ค๋‹ต : 2
์ •๋‹ต : 1

 

๊ทธ๋ ‡๋‹ค.

์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์ˆœ๊ฐ„์ด๋™์„ ์šฐ์„ ์ ์œผ๋กœ ํ•ด์•ผํ•˜๋Š”๊ฒƒ

 

์‹œํ–‰์ฐฉ์˜ค 2

 

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

์ง€์˜ฅ์˜ OutOfBounds ..

๋ฒ”์œ„๋„ ์ž˜ ์ •ํ•ด์ฃผ๊ณ  ์กฐ๊ฑด๋„ ์ž˜ ์ •ํ–ˆ๋Š”๋ฐ ์™œ ๋œจ๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ–ˆ๋‹ค

 

if(dis[cur*2] == -1 and cur*2 < 200000) {
            dis[cur*2] = dis[cur];
            q.push(cur*2);
        }

์›์ธ ์ฐพ์Œ...

์‡ผํŠธ์„œํ‚ทใ… ใ… ใ… ใ… ใ… ใ… ใ… ใ… 

 

if์ ˆ์—์„œ ์กฐ๊ฑด์ด ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ์•ž ์กฐ๊ฑด์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๊ณ 

ํ•ด๋‹น ์กฐ๊ฑด์ด true ์ด๋ฉด ๋’ค์— ์กฐ๊ฑด์„ ํ™•์ธ

ํ•ด๋‹น ์กฐ๊ฑด์ด false ์ด๋ฉด ๋’ค์— ์กฐ๊ฑด์„ ํ™•์ธํ•˜์ง€๋„ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ„๋‹ค

 

๊ทธ๋ ‡๋‹ค.. dis[cur*2] ์—์„œ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๋ฒ„๋ฆฌ๋‹ˆ ๋Ÿฐํƒ€์ž„์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๊ฒƒ...

ํ™•์ธ์„.. ์ž˜ํ•˜์ž ใ… ใ… ใ… ใ… ใ… ใ… 

 

๋ฐ˜์‘ํ˜•