๋ฆฌ๋ชจ์ปจ
https://www.acmicpc.net/problem/1107
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋ง์ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
2 ์ด | 256 MB | 29717 | 6775 | 4628 | 22.196% |
๋ฌธ์
์๋น์ด๋ TV๋ฅผ ๋ณด๊ณ ์๋ค. ์๋น์ด๋ ์ฑ๋์ ๋๋ฆฌ๋ ค๊ณ ํ์ง๋ง, ๋ฒํผ์ ๋๋ฌด ์ธ๊ฒ ๋๋ฅด๋ ๋ฐ๋์, ์ผ๋ถ ์ซ์ ๋ฒํผ์ด ๊ณ ์ฅ๋ฌ๋ค.
๋ฆฌ๋ชจ์ปจ์๋ ๋ฒํผ์ด 0๋ถํฐ 9๊น์ง ์ซ์, +์ -๊ฐ ์๋ค. +๋ฅผ ๋๋ฅด๋ฉด ํ์ฌ ๋ณด๊ณ ์๋ ์ฑ๋์์ +1๋ ์ฑ๋๋ก ์ด๋ํ๊ณ , -๋ฅผ ๋๋ฅด๋ฉด -1๋ ์ฑ๋๋ก ์ด๋ํ๋ค. ์ฑ๋ 0์์ -๋ฅผ ๋๋ฅธ ๊ฒฝ์ฐ์๋ ์ฑ๋์ด ๋ณํ์ง ์๊ณ , ์ฑ๋์ ๋ฌดํ๋ ๋งํผ ์๋ค.
์๋น์ด๊ฐ ์ง๊ธ ์ด๋ํ๋ ค๊ณ ํ๋ ์ฑ๋์ N์ด๋ค. ์ด๋ค ๋ฒํผ์ด ๊ณ ์ฅ๋ฌ๋์ง ์ฃผ์ด์ก์ ๋, ์ฑ๋ N์ผ๋ก ์ด๋ํ๊ธฐ ์ํด์ ๋ฒํผ์ ์ต์ ๋ช ๋ฒ ๋๋ฌ์ผํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋น์ด๊ฐ ์ง๊ธ ๋ณด๊ณ ์๋ ์ฑ๋์ 100๋ฒ์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์๋น์ด๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์ฑ๋ N (0 ≤ N ≤ 500,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ๊ณ ์ฅ๋ ๋ฒํผ์ ๊ฐ์ M (0 ≤ M ≤ 10)์ด ์ฃผ์ด์ง๋ค. ๊ณ ์ฅ๋ ๋ฒํผ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ ์งธ ์ค์๋ ๊ณ ์ฅ๋ ๋ฒํผ์ด ์ฃผ์ด์ง๋ฉฐ, ๊ฐ์ ๋ฒํผ์ด ์ฌ๋ฌ ๋ฒ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฑ๋ N์ผ๋ก ์ด๋ํ๊ธฐ ์ํด ๋ฒํผ์ ์ต์ ๋ช ๋ฒ ๋๋ฌ์ผ ํ๋์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๋์ ๋ต
์ฝ๋
์ฒซ๋ฒ์งธ (์กฐ๊ฑด ์ฌ์ฉ)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int N, M;
int tmp_arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
vector<int> num_arr;
vector<int> clicked_btns;
vector<int>::iterator iter;
int near_num = 1e9;
int store_num = 1e9;
int length_N;
bool isInNumArr(int num) {
int size = num_arr.size();
for (int i = 0; i < size; i++) {
if (num == num_arr[i])
return true;
}
return false;
}
void findNearNum(int num, int len, int now_num) {
if (len == -1) {
int tmp = abs(N - now_num);
if (near_num > tmp) {
near_num = tmp;
store_num = now_num;
}
return;
}
vector<int> tmp_buttons;
if (length_N == len + 1 && len>0)
// ๋ ์๋ฆฌ ์ด์์ผ ๋, ๋งจ ์ฒ์์ 0์ด ๋์ฌ ์ ์์
// 100 ์ดํ์ผ ๋ ์ฒซ์๋ฆฌ์ 0์ด ๋์ฌ ์ ์์ผ๋ฏ๋ก 1๋ฒ๋ง checkํ๋ฉด ๋จ
// 100์ด์์ผ ๋๋ 0์ด ๋์๋ 100์์ ์ด๋ํ๋ ๊ฒ์ด ๋ ๋์ผ๋ฏ๋ก ๋ ๋ฒ ์ด์ ๋น๊ตํ ํ์ x
tmp_buttons.push_back(0);
int first = num / pow(10, len);
/*
if (first < 0)
first = -1;
else if (first > 10)
first = 10;
*/
int flag = 0;
if (isInNumArr(first)) {
tmp_buttons.push_back(first);
flag = 1;
}
int dist = 1;
while (1) { //3
if (isInNumArr(first - dist)) {
tmp_buttons.push_back(first - dist);
flag = 1;
}
if (isInNumArr(first + dist)) {
tmp_buttons.push_back(first + dist);
flag = 1;
}
dist++;
if (first - dist < 0 && first + dist > 9)
break;
if (flag)
break;
flag = 0;
}
int size = tmp_buttons.size();
for (int i = 0; i < size; i++) { // 3
int tmp = tmp_buttons[i];
findNearNum(num - tmp * pow(10, len), len - 1, now_num * 10 + tmp); // 6
}
}
int getLength(int num) { // 6
int length = 1;
while (num /= 10)
length++;
return length;
}
int main() {
cin >> N >> M;
for (int i = 0; i < M; i++) {
int tmp; cin >> tmp;
tmp_arr[tmp] = -1;
}
for (int i = 0; i < 10; i++) { // ์๋ ๋ฒํผ ์ ์ฅ
if (tmp_arr[i] != -1)
num_arr.push_back(i);
}
int n1 = abs(N - 100);
length_N = getLength(N);
findNearNum(N, length_N - 1, 0);
int n2 = near_num + getLength(store_num);
//cout << near_num << " " << store_num << endl;
cout << (n1 > n2 ? n2 : n1);
}
๊ฐ ์๋ฆฟ์๋ง๋ค ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ฆฌ(์ต๋ 3๊ฐ)๋ฅผ arr์ ๋ฃ๊ณ ์ฌ๊ท ํธ์ถํด์ ํธ๋ ๋ฐฉ์์ด๋ค. ์ด ์ฝ๋์์๋ ์๋ฆฟ์๋๋ฌธ์ ์ฃผ์ด์ ธ์ผํ ์กฐ๊ฑด์ด ๋ง์๋ฐ, ์ด ์กฐ๊ฑด์ ๋ค ๊ธฐ์ฌํ๋ ๊ฒ๋ณด๋ค brute force ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ซ๋ค.
ex_)
1000
2
0 1
์ผ ๋, 4์๋ฆฌ ์๊ฐ ์๋๋ผ 3์๋ฆฌ ์์ธ 999๋ฅผ ๊ณ ๋ คํ๋ ค๋ฉด ์ฒซ์๋ฆฌ์ 0์ด ๋์ฌ ์ ์๋๋ก ํ๋ฉด ๋๋ค.
9999
1
9
์ผ ๋, 4์๋ฆฌ ์๊ฐ ์๋๋ผ 5์๋ฆฌ ์์ธ 10000์ ๊ณ ๋ คํ๋ ค๋ฉด ํ ์๋ฆฌ ์ ๋ ํฐ ์๋ฆฟ์๋ถํฐ ๊ณ์ฐํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋ณต์กํด์ง๋ฏ๋ก brute force๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ๋ซ๋ค.
๋๋ฒ์งธ (brute force)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int N, M;
int N_length = 0;
int tmp_arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
vector<int> num_arr;
int near_dist = 1e9;
int near_num = 1e9;
int getLength(int num) {
int length = 1;
while (num /= 10)
length++;
return length;
}
void findNearNum(int size, int num) { // size : ์ซ์ ๊ธธ์ด
if (size == 0) {
int tmp = abs(N - num) + getLength(num);
if (tmp < near_dist) {
near_dist = tmp;
near_num = num;
}
return;
}
int num_size = num_arr.size();
for (int i = 0; i < num_size; i++) {
findNearNum(size - 1, num * 10 + num_arr[i]);
}
}
int main() {
cin >> N >> M;
int tmpN = N;
N_length = getLength(N);
for (int i = 0; i < M; i++) {
int tmp; cin >> tmp;
tmp_arr[tmp] = -1;
}
for (int i = 0; i < 10; i++) { // ์๋ ๋ฒํผ ์ ์ฅ
if (tmp_arr[i] != -1)
num_arr.push_back(i);
}
int n1 = abs(N - 100);
int n2 = 1e9;
if (num_arr.size() != 0) {
for (int size = N_length - 1; size <= N_length + 1; size++) {
if (size == 0) { // ํ๊ธ์
continue;
}
findNearNum(size,0);
}
}
n2 = near_dist;
//cout << near_dist << " " << near_num << endl;
cout << (n1 > n2 ? n2 : n1);
}
ํ ์คํธ์ผ์ด์ค
1235 3
1 2 3
=> 236 999
=> 239
0
9
0 1 2 3 4 5 6 7 9
=> 8 8
=> 9
5678
0
=> 0 5678
=> 4
150
2
1 6
=> 50 200
=> 50
9999
1
9
=> 10000
=> 6
(์ฒซ๋ฒ์งธ ์ฝ๋์์ ์๋๋ testcase)
=> 8888
=> 1115
1000
2
0 1
=> 999
=> 4
(์ฒซ๋ฒ์งธ ์ฝ๋์์ ์๋๋ testcase)
=> 2222
=> 900
=> 1 999
=> 4
199
1 9
=> 4
์ฒซ๋ฒ์งธ ์ฝ๋๊ฐ ์คํจํ ์ด์ ๋ ์ฃผ์ด์ง ์์์ ์๋ฆฟ์๊ฐ ํ๋ ๋ ๋์ ๊ฒฝ์ฐ๋ ํ๋ ๋ ๋ฎ์ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์กฐ๊ฑด์ ๋ง์ด ์ฃผ๋ฉด ํ ์ ์๊ฒ ์ง๋ง brute force๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ brute force๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ข๊ฒ ๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 13023 :: ABCDE (ํ ์คํธ์ผ์ด์ค, ์ฝ๋) (0) | 2020.05.06 |
---|---|
[c++] BOJ 1393๋ฒ :: ์ํ์ฒ ๋ ๊ตฌ๊ตฌํ (์ฝ๋, ์ฃผ์ํ ์ , ํ ์คํธ์ผ์ด์ค) (0) | 2020.05.02 |
[c++] BOJ 1309๋ฒ :: ๋๋ฌผ์ (0) | 2020.04.25 |
[c++] BOJ 1461๋ฒ :: ๋์๊ด (0) | 2020.04.23 |
[c++] BOJ 9251๋ฒ :: LCS (ํ์ด ๋ฐ ์ค๋ช + ๋ ๋์ ์ฝ๋) (0) | 2020.04.18 |
Comment