백준/lv.3

[lv3] 1107. 리모컨(Python 파이썬 풀이)

MakeMoneying 2021. 2. 23. 19:08

출처

https://www.acmicpc.net/problem/1107

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

결과

문제

수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.

수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.

수빈이가 지금 보고 있는 채널은 100번이다.

입력

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.

출력

첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.

예제 입력 1

5457
3
6 7 8

예제 출력 1

6

예제 입력 2

100
5
0 1 2 3 4

예제 출력 2

0

예제 입력 3

500000
8
0 2 3 4 6 7 8 9

예제 출력 3

11117    

해석

초기 위치는 100에서 시작하여 N까지 가는데 버튼 M개가 고장나서 버튼을 몇 번 눌러야 하는지를 구하는 문제이다.
100에서 + 혹은 -만을 눌러서 가는게 더 빠른지(N이 99인데 M이 9 같은 경우가 있으므로), 혹은 N에 최대한 가까운 값으로 이동하여 + 혹은 -를 눌러서 이동해야 하는지를 구하면 된다.
고장난 버튼들을 li라는 집합(set)에 집어 넣어서 숫자를 0부터 500000까지 확인하여 이 중에서 겹치는게 없을 때에만 N까지의 거리를 구하면 되고, 그 값들 중에서 가장 작은 값을 출력하면 된다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
import sys
= int(sys.stdin.readline())
= int(sys.stdin.readline())
li = set(list(sys.stdin.readline().split()))
res = abs(100-n)
for i in range(1000001):
    ba = set(list(str(i)))
    le = len(str(i))
    if not ba&li:
        res = min(res,le+abs(n-i))
print(res)
cs