출처
https://www.acmicpc.net/problem/1107
결과
문제
수빈이는 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
n = int(sys.stdin.readline())
m = 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 |
'백준 > lv.3' 카테고리의 다른 글
[lv3] 1389. 케빈 베이컨의 6단계 법칙(Python 파이썬 풀이) (0) | 2021.03.10 |
---|---|
[lv3] 1260. DFS와 BFS (Python 파이썬 풀이) (0) | 2021.03.10 |
[lv3] 1074. Z(Python 파이썬 풀이) (0) | 2021.02.23 |
[lv3] 1012. 유기농 배추(Python 파이썬 풀이) (0) | 2021.02.23 |
[lv3] 1003. 피보나치 함수(Python 파이썬 풀이) (0) | 2021.02.23 |