BOJ 1107. ๋ฆฌ๋ชจ์ปจ
๐โโ๏ธ[Gold V] ๋ฆฌ๋ชจ์ปจ - 1107
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2020 KB, ์๊ฐ: 288 ms
๋ถ๋ฅ
๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
์ ์ถ ์ผ์
2024๋ 1์ 18์ผ 15:38:06
๋ฌธ์ ์ค๋ช
์๋น์ด๋ TV๋ฅผ ๋ณด๊ณ ์๋ค. ์๋น์ด๋ ์ฑ๋์ ๋๋ฆฌ๋ ค๊ณ ํ์ง๋ง, ๋ฒํผ์ ๋๋ฌด ์ธ๊ฒ ๋๋ฅด๋ ๋ฐ๋์, ์ผ๋ถ ์ซ์ ๋ฒํผ์ด ๊ณ ์ฅ๋ฌ๋ค.
๋ฆฌ๋ชจ์ปจ์๋ ๋ฒํผ์ด 0๋ถํฐ 9๊น์ง ์ซ์, +์ -๊ฐ ์๋ค. +๋ฅผ ๋๋ฅด๋ฉด ํ์ฌ ๋ณด๊ณ ์๋ ์ฑ๋์์ +1๋ ์ฑ๋๋ก ์ด๋ํ๊ณ , -๋ฅผ ๋๋ฅด๋ฉด -1๋ ์ฑ๋๋ก ์ด๋ํ๋ค. ์ฑ๋ 0์์ -๋ฅผ ๋๋ฅธ ๊ฒฝ์ฐ์๋ ์ฑ๋์ด ๋ณํ์ง ์๊ณ , ์ฑ๋์ ๋ฌดํ๋ ๋งํผ ์๋ค.
์๋น์ด๊ฐ ์ง๊ธ ์ด๋ํ๋ ค๊ณ ํ๋ ์ฑ๋์ N์ด๋ค. ์ด๋ค ๋ฒํผ์ด ๊ณ ์ฅ๋ฌ๋์ง ์ฃผ์ด์ก์ ๋, ์ฑ๋ N์ผ๋ก ์ด๋ํ๊ธฐ ์ํด์ ๋ฒํผ์ ์ต์ ๋ช ๋ฒ ๋๋ฌ์ผํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋น์ด๊ฐ ์ง๊ธ ๋ณด๊ณ ์๋ ์ฑ๋์ 100๋ฒ์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์๋น์ด๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์ฑ๋ N (0 โค N โค 500,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ๊ณ ์ฅ๋ ๋ฒํผ์ ๊ฐ์ M (0 โค M โค 10)์ด ์ฃผ์ด์ง๋ค. ๊ณ ์ฅ๋ ๋ฒํผ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ ์งธ ์ค์๋ ๊ณ ์ฅ๋ ๋ฒํผ์ด ์ฃผ์ด์ง๋ฉฐ, ๊ฐ์ ๋ฒํผ์ด ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฑ๋ N์ผ๋ก ์ด๋ํ๊ธฐ ์ํด ๋ฒํผ์ ์ต์ ๋ช ๋ฒ ๋๋ฌ์ผ ํ๋์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
์์ ํ์ ๋ฌธ์ ๋ก ๋๋ DFS๋ฅผ ์ด์ฉํ๋ค.
์์ธ์ฒ๋ฆฌ๊ฐ ์ค์ํ ๋ฌธ์ ์๋๋ฐ ํนํ ํ์๋ฆฌ ์ซ์์ธ 0์ผ๋ ์ ์ฒ๋ฆฌํ์ด์ผํ๋ค.
๋๋ต์ ์ธ ํ์ ๊ธ๋ฐฉ ์ก๊ณ ํ์๋๋ฐ ๋ฐ๋ก๊ฐ ๋ง์์ ๊ณ์ ํ๋ ธ๋ค.
DFS๋ ๋ค์๊ณผ ๊ฐ์ด ์งฐ๋ค.
void DFS(int L, int ret)
{
if (L > digit + 1)
return;
if (L == digit || L == digit - 1 || L == digit + 1)
{
if (L != 0)
{
int dis = abs(ret - num);
int temp = dis + L;
//cout << "ret : " << ret << endl;
res = min(res, temp);
//cout << "res : " << res << endl;
// ์ํ๋ ์ซ์๊ฐ 0์ผ๋ ์์ธ์ฒ๋ฆฌ
if (digit == 1 && ret == 0 && num == 0)
res = 1;
}
}
for (int i = 0; i <= 9; ++i)
{
bool flag = true;
for (int j = 0; j < broken.size(); ++j)
{
if (i == broken[j])
{
flag = false;
break;
}
}
if (flag == true)
{
DFS(L + 1, ret * 10 + i);
}
}
}
๊ณ ์ฅ๋ ์ซ์๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ๋ฒํธ๋ฅผ ๋๋ฌ๋ดค๋ค.
์ค์ํ ์ ์ ์ํ๋ ์ซ์์ ์๋ฆฟ์๊น์ง ๋๋ฅด๋๊ฒ ์๋๋ผ ๊ทธ์ , ๊ทธํ ๊น์ง ์๊ฐํด์ ๊ฒฝ์ฐ๋ฅผ ๋ค ์๊ฐํด์ผํ๋ค.
๋ํ +,-๋ก๋ง ์ํ๋ ์ซ์๊น์ง ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ ์งง์ ์ ์์ผ๋ฏ๋ก DFS๊ฐ ๋๋๊ณ ๋ง์ง๋ง์ ๋ฐ๋ก ์ฒ๋ฆฌํด์ ์ต์๊ฐ์ ๊ตฌํด์ผํ๋ค.
๊ฒจ์ฐ ํ์๋คโฆ
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int num, n, digit = 0, cur = 100, res = 123456789;
vector<int> broken;
void setting()
{
cin >> num >> n;
broken = vector<int>(n);
for (int i = 0; i < n; ++i)
{
cin >> broken[i];
}
int temp = num;
while (temp > 0)
{
digit++;
temp /= 10;
}
if (num == 0)
digit = 1;
}
void DFS(int L, int ret)
{
if (L > digit + 1)
return;
if (L == digit || L == digit - 1 || L == digit + 1)
{
if (L != 0)
{
int dis = abs(ret - num);
int temp = dis + L;
//cout << "ret : " << ret << endl;
res = min(res, temp);
//cout << "res : " << res << endl;
if (digit == 1 && ret == 0 && num == 0)
res = 1;
}
}
for (int i = 0; i <= 9; ++i)
{
bool flag = true;
for (int j = 0; j < broken.size(); ++j)
{
if (i == broken[j])
{
flag = false;
break;
}
}
if (flag == true)
{
DFS(L + 1, ret * 10 + i);
}
}
}
void solve()
{
DFS(0, 0);
int temp = abs(num - cur);
res = min(res, temp);
cout << res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}