https://www.acmicpc.net/problem/1107
#include
#include
#include
using namespace std;
vector isBroken(10, false); // 고장난 버튼을 알려주는 벡터
// 누를 수 있는 숫자인지 알려주는 함수
int canPush(int num) {
int push = 0;
while(true)
{
if (isBroken[num%10] == true) return 0;
else {
num /= 10;
push++;
}
if (num == 0) return push;
}
}
int main ()
{
int answer=0; // 몇번 버튼을 눌렀는지 저장하는 변수
int N, M, temp; // N = 이동하려는 채널, M = 고장난 버튼
int hi,lo; // hi = 누를 수 있는 숫자 중 N에서 가장 가까운 큰 수, lo = 작은 수
int button_100; // 100에서 +,-로만 수에 도달했을 때의 버튼 눌리는 수.
// 입력을 받는다.
cin >> N >> M;
for (int i = 0; i < M; i++)
{
cin >> temp;
isBroken[temp] = true;
}
// 이동하려는 채널에서
// 아래로 내려가면서 누를 수 있는 수를 찾는다.
temp = N;
while (true)
{
// 범위를 벗어나지 않게끔한다.
if (temp < 0) {lo = 1000000; break;}
if (canPush(temp) != 0) { lo = canPush(temp)+(N-temp); break; }
else temp--;
}
// 이동하려는 채널에서
// 위로 가면서 누를 수 있는 수를 찾는다.
temp = N+1;
while (true)
{
// 범위를 벗어나지 않게끔한다.
if (temp >= 1000000) {hi=1000000; break;}
if (canPush(temp) != 0) { hi = canPush(temp)+(temp-N); break; }
else temp++;
}
// 100에서 출발할 경우를 생각해본다.
if (N-100 > 0) button_100 = N-100;
else button_100 = 100-N;
// hi 와 lo 와 100출발 을 비교한다.
if (hi <= lo && hi <= button_100) cout << hi << endl;// hi가 최소인 경우
else if (hi > lo && lo < button_100) cout << lo << endl; // lo가 최소인 경우
else cout << button_100 << endl; // 100에서 출발이 최소인 경우
}
'Coding > PS' 카테고리의 다른 글
[백준 2193] 이친수 (0) | 2019.09.27 |
---|---|
영화감독 숌 (0) | 2019.07.06 |
덩치 (0) | 2019.07.06 |
분해합 (0) | 2019.07.05 |
카드의 합 구하기 (0) | 2019.07.05 |