[백준/파이썬] 1107번 리모컨 풀이
업데이트:
문제 정보
- 문제 출처: 백준 온라인 저지
- 문제 링크: 1107번 리모컨
- 문제풀이 코드 GitHub 링크
- 제출 언어: Python 3
풀이
문제
현재 채널은 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)으로 잡고, 완전 탐색으로 더 작은 답이 있는지 찾는 방식입니다.
댓글남기기