코딩테스트/백준 (python)

백준 / 1107번 / 리모컨 / python 파이썬

seulll 2024. 9. 12. 19:45

 

문제 : https://www.acmicpc.net/problem/1107

 

 

코드 

import sys
input = sys.stdin.readline

n = int(input())
m = int(input())
ans = abs(100 - n)

if m:
    btn = list(input().split())
else:
    btn = []

for num in range(1000001):
    for i in str(num):
        if i in btn:
            break
    else:
        ans = min(ans, len(str(num)) + abs(num - n))

print(ans)

 

처음에는 버튼을 최소한으로 눌러야 한다는 조건에 고장난 버튼의 최소, 최댓값과 ans(n - 100)와의 절댓값의 차가 더 작은 것을 구해가며 접근했지만 몇 개의 예제를 제외하고는 올바른 출력이 나오지 않았다. 

 

그 이유는 작은 수에서 큰 수로 이동할 땐 500,000 까지만 보면 되지만 반대로 큰 수에서 작은 수로 내려올 수 있으므로 1,000,000 까지 봐야했는데 범위를 잘못 지정한 것이었다.

 

또한 , 아래 코드와 같이

ans = min(ans, len(str(num)) + abs(num - n)):

 

min(기존 값, 번호를 누른 횟수 +  목표 채널까지의 차)를 구하는 식을 세우는 것이 문제 접근의 핵심인 것 같다.