728x90
버튼 10개가 모두 고장났을 때를 반드시 처리해줘야 한다. 안 그러면 무한루프에 빠지게 된다.
1씩 늘리거나 줄이면서 이 숫자를 리모컨으로 입력할 수 있을 때까지 반복한다.
입력할 수 있으면 while문에서 나온다. 그리고 100에서 이동하는 것과 버튼으로 누른 후 + 버튼이나 - 버튼으로 이동하는 것 중 어떤 것이 더 빠른지를 체크하면 된다.
int를 string으로 변경하는 것은 <string> 헤더에 있는 to_string() 함수를 사용하여 해당 채널로 가려면 숫자 버튼을 몇 번 눌러야 하는지 알아내었다.
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int n, m, num;
vector<bool> v(10, true);
cin >> n >> m;
int ans;
for (int i = 0; i < m; i++) {
cin >> num;
v[num] = false;
}
int k = 0;
bool up;
if (m < 10) {
while (true) {
int divider = 1;
bool answer = true;
if (n - k > 0) {
while (true) {
if ((n - k) / divider == 0) {
break;
}
if (!v[(n - k) / divider % 10]) {
answer = false;
break;
}
divider *= 10;
}
if (answer) {
ans = k;
up = false;
break;
}
}
else if (n - k == 0) {
if (!v[0]) {
answer = false;
}
if (answer) {
ans = k;
up = false;
break;
}
}
answer = true;
if (n + k == 0) {
if (!v[0]) {
answer = false;
}
if (answer) {
ans = k;
up = true;
break;
}
}
divider = 1;
while (true) {
if ((n + k) / divider == 0)
break;
if (!v[(n + k) / divider % 10]) {
answer = false;
break;
}
divider *= 10;
}
if (answer) {
ans = k;
up = true;
break;
}
k++;
}
}
else {
cout << abs(n - 100);
return 0;
}
cout << min((int)(ans + to_string((up ? n + k : n - k)).size()), abs(n - 100));
return 0;
}
728x90
'알고리즘 문제' 카테고리의 다른 글
[백준] 1890번 점프 (0) | 2021.01.13 |
---|---|
[백준] 1676번 팩토리얼 0의 개수 (0) | 2021.01.13 |
[백준] 1013번 Contact (0) | 2021.01.08 |
[백준] 10974번 모든 순열 (0) | 2021.01.05 |
[백준] 1992번 쿼드트리 (0) | 2021.01.05 |