문제 링크 : https://www.acmicpc.net/problem/1107
브루트포스 문제이다.
0번 채널부터 999999번 채널까지 for문을 통해 돌면서 이동하려고 하는 채널 n까지 버튼을 몇 번 눌러야 하는지 계산하고 최솟값을 구해서 출력하면 된다.
for문을 통해 0번 채널부터 차례대로 돌 때, 고장난 버튼을 눌러야 하는 경우는 건너뛴다.
이 문제를 풀 때, 몇 번 채널까지 탐색을 진행할지를 잘 설정해주어야 한다. 또한 채널의 초기값이 100번이므로 100번에서 n번 채널까지는 숫자 버튼을 누르지 않고 +,- 버튼만 눌러도 된다는 점을 주의해야한다.
from sys import stdin
n = int(stdin.readline()) # 이동하려는 채널
m = int(stdin.readline()) # 고장난 버튼의 개수
button = [i for i in range(10)] # 버튼 리스트
delList = [] # 고장난 버튼 리스트
result = abs(100 - n) # result의 초기값은 100번 채널에서 +,-버튼 만을 통해 n번 채널로 이동할 때 버튼을 누르게 되는 횟수
if m != 0: # 고장난 버튼의 개수가 0이 아닐 때만 입력을 받음
delList = list(map(int,stdin.readline().split()))
for i in delList:
del button[button.index(i)] # 버튼 리스트에서 고장난 버튼을 삭제해줌
# 0번 채널부터 999999번 채널까지 반복
for i in range(1000000):
iList = list(str(i))
tf = True
for j in iList:
if int(j) in button:
continue
tf = False # 만약에 i번 채널로 한번에 이동할 때 고장난 버튼을 누르게 되면 tf를 False로 바꾸고 break
break
if tf == False: # 만약 고장난 버튼을 눌러야 하면(tf == False 이면) continue
continue
# 만약 고장난 버튼을 누르지 않아도 된다면, i번 채널에서 n번 채널까지 가기 위해 버튼을 누르는 횟수와 result 값을 비교해서 그 값이 작다면 result에 대입
if abs(i - n) + len(str(i)) < result:
result = abs(i - n) + len(str(i))
print(result)