[백준/파이썬] 1107번 리모컨 풀이

업데이트:



문제 정보


풀이

문제

현재 채널은 100이고, 목표 채널 N으로 이동하려고 합니다.

  • +, - 버튼으로는 채널을 1씩 이동할 수 있습니다.
  • 숫자 버튼은 일부 고장나서 누를 수 없을 수 있습니다.

최소 버튼 입력 횟수를 구하는 문제입니다.

  • 자세한 문제 및 입출력 예제는 상단의 문제 출처(백준 홈페이지)를 참조해주세요

코드

n,m=int(input()),int(input())
btns=set([])
if m>0:btns=set(input().split())

m=abs(n-100)
b=n+100
for i in range(10_000_001):
    f=True
    for c in str(i):f&=c not in btns
    d=len(str(i))+abs(n-i)
    if f and m>d:
        b=m
        m=d
    elif b-d<0:break

print(m)

설명

핵심은 두 가지 경우를 모두 비교하는 것입니다.

  • 숫자 버튼을 전혀 쓰지 않고 100에서 +/-만 누르는 경우: abs(N-100)
  • 어떤 채널 i를 숫자 버튼으로 입력한 뒤 +/-로 보정하는 경우: len(str(i)) + abs(N-i)

코드는 0부터 충분히 큰 범위까지 순회하면서, 고장 나지 않은 숫자만으로 만들 수 있는 채널인지 검사하고 최솟값을 갱신합니다.

즉, 기준값을 abs(N-100)으로 잡고, 완전 탐색으로 더 작은 답이 있는지 찾는 방식입니다.



댓글남기기