BOJ 9019. DSLR
๐โโ๏ธ[Gold IV] DSLR - 9019
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2288 KB, ์๊ฐ: 4168 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์
์ ์ถ ์ผ์
2024๋ 3์ 25์ผ 19:22:21
๋ฌธ์ ์ค๋ช
๋ค ๊ฐ์ ๋ช ๋ น์ด D, S, L, R ์ ์ด์ฉํ๋ ๊ฐ๋จํ ๊ณ์ฐ๊ธฐ๊ฐ ์๋ค. ์ด ๊ณ์ฐ๊ธฐ์๋ ๋ ์ง์คํฐ๊ฐ ํ๋ ์๋๋ฐ, ์ด ๋ ์ง์คํฐ์๋ 0 ์ด์ 10,000 ๋ฏธ๋ง์ ์ญ์ง์๋ฅผ ์ ์ฅํ ์ ์๋ค. ๊ฐ ๋ช ๋ น์ด๋ ์ด ๋ ์ง์คํฐ์ ์ ์ฅ๋ n์ ๋ค์๊ณผ ๊ฐ์ด ๋ณํํ๋ค. n์ ๋ค ์๋ฆฟ์๋ฅผ d1, d2, d3, d4๋ผ๊ณ ํ์(์ฆ n = ((d1 ร 10 + d2) ร 10 + d3) ร 10 + d4๋ผ๊ณ ํ์)
- D: D ๋ n์ ๋ ๋ฐฐ๋ก ๋ฐ๊พผ๋ค. ๊ฒฐ๊ณผ ๊ฐ์ด 9999 ๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ 10000 ์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ทจํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ฐ(2n mod 10000)์ ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค.
- S: S ๋ n์์ 1 ์ ๋บ ๊ฒฐ๊ณผ n-1์ ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค. n์ด 0 ์ด๋ผ๋ฉด 9999 ๊ฐ ๋์ ๋ ์ง์คํฐ์ ์ ์ฅ๋๋ค.
- L: L ์ n์ ๊ฐ ์๋ฆฟ์๋ฅผ ์ผํธ์ผ๋ก ํ์ ์์ผ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค. ์ด ์ฐ์ฐ์ด ๋๋๋ฉด ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๋ค ์๋ฆฟ์๋ ์ผํธ๋ถํฐ d2, d3, d4, d1์ด ๋๋ค.
- R: R ์ n์ ๊ฐ ์๋ฆฟ์๋ฅผ ์ค๋ฅธํธ์ผ๋ก ํ์ ์์ผ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค. ์ด ์ฐ์ฐ์ด ๋๋๋ฉด ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๋ค ์๋ฆฟ์๋ ์ผํธ๋ถํฐ d4, d1, d2, d3์ด ๋๋ค.
์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ, L ๊ณผ R ๋ช ๋ น์ด๋ ์ญ์ง ์๋ฆฟ์๋ฅผ ๊ฐ์ ํ๊ณ ์ฐ์ฐ์ ์ํํ๋ค. ์๋ฅผ ๋ค์ด์ n = 1234 ๋ผ๋ฉด ์ฌ๊ธฐ์ L ์ ์ ์ฉํ๋ฉด 2341 ์ด ๋๊ณ R ์ ์ ์ฉํ๋ฉด 4123 ์ด ๋๋ค.
์ฌ๋ฌ๋ถ์ด ์์ฑํ ํ๋ก๊ทธ๋จ์ ์ฃผ์ด์ง ์๋ก ๋ค๋ฅธ ๋ ์ ์ A์ B(A โ B)์ ๋ํ์ฌ A๋ฅผ B๋ก ๋ฐ๊พธ๋ ์ต์ํ์ ๋ช ๋ น์ด๋ฅผ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ์๋ฅผ ๋ค์ด์ A = 1234, B = 3412 ๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ ์ฉํ๋ฉด A๋ฅผ B๋ก ๋ณํํ ์ ์๋ค.
1234 โL 2341 โL 3412
1234 โR 4123 โR 3412
๋ฐ๋ผ์ ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋จ์ ์ด ๊ฒฝ์ฐ์ LL ์ด๋ RR ์ ์ถ๋ ฅํด์ผ ํ๋ค.
n์ ์๋ฆฟ์๋ก 0 ์ด ํฌํจ๋ ๊ฒฝ์ฐ์ ์ฃผ์ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด์ 1000 ์ L ์ ์ ์ฉํ๋ฉด 0001 ์ด ๋๋ฏ๋ก ๊ฒฐ๊ณผ๋ 1 ์ด ๋๋ค. ๊ทธ๋ฌ๋ R ์ ์ ์ฉํ๋ฉด 0100 ์ด ๋๋ฏ๋ก ๊ฒฐ๊ณผ๋ 100 ์ด ๋๋ค.
์ ๋ ฅ
ํ๋ก๊ทธ๋จ ์ ๋ ฅ์ T ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ก ๊ตฌ์ฑ๋๋ค. ํ ์คํธ ์ผ์ด์ค ๊ฐ์ T ๋ ์ ๋ ฅ์ ์ฒซ ์ค์ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ก๋ ๋ ๊ฐ์ ์ ์ A์ B(A โ B)๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋๋ฐ A๋ ๋ ์ง์คํฐ์ ์ด๊ธฐ ๊ฐ์ ๋ํ๋ด๊ณ B๋ ์ต์ข ๊ฐ์ ๋ํ๋ธ๋ค. A ์ B๋ ๋ชจ๋ 0 ์ด์ 10,000 ๋ฏธ๋ง์ด๋ค.
์ถ๋ ฅ
A์์ B๋ก ๋ณํํ๊ธฐ ์ํด ํ์ํ ์ต์ํ์ ๋ช ๋ น์ด ๋์ด์ ์ถ๋ ฅํ๋ค. ๊ฐ๋ฅํ ๋ช ๋ น์ด ๋์ด์ด ์ฌ๋ฌ๊ฐ์ง๋ฉด, ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๋ค.
๐ํ์ด
BFS ๋ฌธ์ ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ํ์ํ๋ฏ์ด ํ๋ฉด๋๋ค.
์ ์ฐ๋ณ์์ ๊ฐ ํจ์๋ค์ ๊ตฌํํ๋ค.
int t, a, b;
bool visited[10010];
int D(int n)
{
return (2 * n) % 10000;
}
int S(int n)
{
int ret = n;
ret--;
if (ret == -1)
ret = 9999;
return ret;
}
int L(int n)
{
int ret = n;
int temp = n / 1000;
ret = (n % 1000) * 10 + temp;
return ret;
}
int R(int n)
{
int temp = n % 10;
temp *= 1000;
return (n / 10) + temp;
}
BFS์์๋ ์ซ์์ ์ด๋๊น์ง ์ ๋ ฅํ string์ ๊ธฐ์ตํ๋ค.
void BFS()
{
queue<pair<int, string>> q;
q.push({ a, "" });
while (q.empty() == false)
{
int num = q.front().first;
string str = q.front().second;
q.pop();
if (num == b)
{
cout << str << '\n';
return;
}
int d, s, l, r;
d = D(num);
l = L(num);
r = R(num);
s = S(num);
if (visited[d] == false)
{
visited[d] = true;
q.push({ d, str + "D" });
}
if (visited[s] == false)
{
visited[s] = true;
q.push({ s, str + "S" });
}
if (visited[l] == false)
{
visited[l] = true;
q.push({ l, str + "L" });
}
if (visited[r] == false)
{
visited[r] = true;
q.push({ r, str + "R" });
}
}
}
visited๋ฅผ ์ฌ์ฉํด์ ํ ์ฐ๋ฌผํ ํ์ง์๋๋ก ๋ง๋ค์ด์ผํ๋ค.
solve ์์๋ BFS๋ฅผ ๋๋ฆฌ๊ธฐ์ memset์ผ๋ก ์ด๊ธฐํ์ํจ๋ค.
void solve()
{
cin >> t;
while (t--)
{
cin >> a >> b;
memset(&visited, false, sizeof(visited));
BFS();
}
}
๐์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
// DSLR
int t, a, b;
bool visited[10010];
int D(int n)
{
return (2 * n) % 10000;
}
int S(int n)
{
int ret = n;
ret--;
if (ret == -1)
ret = 9999;
return ret;
}
int L(int n)
{
int ret = n;
int temp = n / 1000;
ret = (n % 1000) * 10 + temp;
return ret;
}
int R(int n)
{
int temp = n % 10;
temp *= 1000;
return (n / 10) + temp;
}
void BFS()
{
queue<pair<int, string>> q;
q.push({ a, "" });
while (q.empty() == false)
{
int num = q.front().first;
string str = q.front().second;
q.pop();
if (num == b)
{
cout << str << '\n';
return;
}
int d, s, l, r;
d = D(num);
l = L(num);
r = R(num);
s = S(num);
if (visited[d] == false)
{
visited[d] = true;
q.push({ d, str + "D" });
}
if (visited[s] == false)
{
visited[s] = true;
q.push({ s, str + "S" });
}
if (visited[l] == false)
{
visited[l] = true;
q.push({ l, str + "L" });
}
if (visited[r] == false)
{
visited[r] = true;
q.push({ r, str + "R" });
}
}
}
void solve()
{
cin >> t;
while (t--)
{
cin >> a >> b;
memset(&visited, false, sizeof(visited));
BFS();
}
}
int main()
{
FILE* stream;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen_s(&stream, "input.txt", "rt", stdin);
solve();
return 0;
}