BOJ 1697. ์จ๋ฐ๊ผญ์ง
๐โโ๏ธ[Silver I] ์จ๋ฐ๊ผญ์ง - 1697
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2676 KB, ์๊ฐ: 0 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์
์ ์ถ ์ผ์
2024๋ 1์ 3์ผ 19:38:38
๋ฌธ์ ์ค๋ช
์๋น์ด๋ ๋์๊ณผ ์จ๋ฐ๊ผญ์ง์ ํ๊ณ ์๋ค. ์๋น์ด๋ ํ์ฌ ์ N(0 โค N โค 100,000)์ ์๊ณ , ๋์์ ์ K(0 โค K โค 100,000)์ ์๋ค. ์๋น์ด๋ ๊ฑท๊ฑฐ๋ ์๊ฐ์ด๋์ ํ ์ ์๋ค. ๋ง์ฝ, ์๋น์ด์ ์์น๊ฐ X์ผ ๋ ๊ฑท๋๋ค๋ฉด 1์ด ํ์ X-1 ๋๋ X+1๋ก ์ด๋ํ๊ฒ ๋๋ค. ์๊ฐ์ด๋์ ํ๋ ๊ฒฝ์ฐ์๋ 1์ด ํ์ 2*X์ ์์น๋ก ์ด๋ํ๊ฒ ๋๋ค.
์๋น์ด์ ๋์์ ์์น๊ฐ ์ฃผ์ด์ก์ ๋, ์๋น์ด๊ฐ ๋์์ ์ฐพ์ ์ ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ด ๋ช ์ด ํ์ธ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ์๋น์ด๊ฐ ์๋ ์์น N๊ณผ ๋์์ด ์๋ ์์น K๊ฐ ์ฃผ์ด์ง๋ค. N๊ณผ K๋ ์ ์์ด๋ค.
์ถ๋ ฅ
์๋น์ด๊ฐ ๋์์ ์ฐพ๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
์ฒ์์ DFS๋ก ํ๋ ค๊ณ ํ๋๋ฐ DFS๋ก ํ๋ฉด ์๋๋ค๋๊ฑธ ์์๋ค.
+1, -1, *2 ํ๋ ๊ฐ๋ค์ด ๋ ๋ฒจ๋ณ๋ก ๋ด๋ ค์ค๋๊น ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์๊ฐํด์ ํ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ 5์์ ์์ํด์ -1ํ ๊ฐ์ผ๋ก 4๊ฐ ๋๊ณ ๋ค์ +1์ ํด์ 5๊ฐ๋๋ฉด ์๋ฏธ ์๋ ๋ฐ๋ณต์ด๋ ๋ค์ ๋๋์๊ฐ์ง ์๊ฒ ๋ง๋ค์ด์ค์ผํ๋ค.
ํ๋ง๋๋ก BFS๋ก ํด๊ฒฐํด์ผํ๋ ๋ฌธ์ ์ด๋ค.
int n, k;
int discovered[100001];
void BFS(int here)
{
queue<pair<int, int>> q;
q.push({ here, 0 });
discovered[n] = true;
while (q.empty() == false)
{
int here = q.front().first;
int cnt = q.front().second;
q.pop();
if (here == k)
{
cout << cnt;
return;
}
if (here + 1 < 100001)
{
if (discovered[here + 1] == false)
{
discovered[here + 1] = true;
q.push({ here + 1, cnt + 1 });
}
}
if (here - 1 >= 0)
{
if (discovered[here - 1] == false)
{
discovered[here - 1] = true;
q.push({ here - 1, cnt + 1 });
}
}
if (here * 2 >= 0 && here * 2 < 100001)
{
if (discovered[here * 2] == false)
{
discovered[here * 2] = true;
q.push({ here * 2, cnt + 1 });
}
}
}
}
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int n, k;
int discovered[100001];
void BFS(int here)
{
queue<pair<int, int>> q;
q.push({ here, 0 });
discovered[n] = true;
while (q.empty() == false)
{
int here = q.front().first;
int cnt = q.front().second;
q.pop();
if (here == k)
{
cout << cnt;
return;
}
if (here + 1 < 100001)
{
if (discovered[here + 1] == false)
{
discovered[here + 1] = true;
q.push({ here + 1, cnt + 1 });
}
}
if (here - 1 >= 0)
{
if (discovered[here - 1] == false)
{
discovered[here - 1] = true;
q.push({ here - 1, cnt + 1 });
}
}
if (here * 2 >= 0 && here * 2 < 100001)
{
if (discovered[here * 2] == false)
{
discovered[here * 2] = true;
q.push({ here * 2, cnt + 1 });
}
}
}
}
void solve()
{
cin >> n >> k;
BFS(n);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}