이 문제는 완전탐색을 통해 정답을 구하는 문제이다.
'''
내 풀이
end를 기준으로 +,- 1씩 시켜서 조건을 만족하는 값까지 찾기
'''
end = int(input())
bn = int(input())
bl = []
if bn>0:
bl = list(map(int, input().split()))
start =100
ans = 0
num = list(map(int,set(str(end))))
if end == 100:
print(0)
elif bn == 10:
print(abs(end-start))
else:
er = 0
for _ in num:
if _ in bl:
er+=1
if er == 0:
print(min(len(str(end)), abs(end-100)))
else:
n1 = end - 1
n2 = end + 1
while end != start:
if n1>=0:
a1 = list(map(int,set(str(n1))))
err1 = 0
for i in a1:
if i in bl:
err1 += 1
if err1 == 0:
ans = n1
break
a2 = list(map(int,set(str(n2))))
err2 = 0
for j in a2:
if j in bl:
err2+=1
if err2 == 0:
ans =n2
break
n1-=1
n2+=1
print(min(abs(end-100), len(str(ans))+abs(ans-end) ))
'''
다른 사람 풀이
나올 수 있는 모든 채널을 처음부터 끝까지 탐색 --> 탐색할 때마다 최소값 업데이트
'''
N = int(input())
M = int(input())
btns = set() # 고장난 버튼 집합
if 0 != M: # 고장난 버튼 있으면 입력
btns = set(input().split())
ans = abs(N - 100) # 100부터 N으로 +나 -버튼 누른 횟수
for num in range(1_000_001): # 0 ~ 1,000,000 채널 번호
str_num = str(num) # 채널 번호를 문자열로
for n in str_num: # 채널 번호의 한 자리씩
if n in btns: # 해당 자리가 고장난 버튼 숫자이면 종료
break
else: # 채널 번호의 모든 자리가 고장나지 않은 경우
print(num)
ans = min(ans, len(str_num) + abs(num - N))
print(ans)
나의 풀이로 풀면 정답지점으로부터 탐색을 시작하기 때문에 모든 채널을 확인하는 것보다 확실히 빠른 속도가 나온다. 하지만 고려해야할 점이 몇가지 있었다.
음수가 되면 a1 = list(map(int,set(str(n1)))) 부분에서 int로 mapping이 되지 않는다. 따라서 valueerror가 일어난다.
==> 음수가 아닐 때만 mapping 시키도록 조건문을 만든다.
이 문제에서 모든 번호가 고장나면 계속 탐색하기 때문에 무한루프가 돌아간다.
==> 모든 번호가 고장나는 경우를 추가하여 조건문을 만든다.