본문 바로가기

개발/algorithm

[백준 1107번] 리모컨 - python

문제 링크

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

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

풀이

- 어떻게 풀어야 하나 모르겠어서 알고리즘 분류를 보니 브루트포스로 풀 수 있는 문제였다. 

- broken :  고장난 버튼 저장 

- answer : 현재 위치가 100이므로 최솟값은 +나 -로만 이동한 경우인 abs(100-n)이다. 

- 채널 수가 무한대 이므로 1000001 까지 탐색한다. 

- 숫자에 고장난 버튼이 포함되어 있으면 break,

아니면 현재 위치로 이동하기 위해 누른 버튼 수 + 현재 위치에서 +,-로 n까지 이동하는 거리와 answer 중 최솟값 갱신 

import sys
input = sys.stdin.readline 

INF = int(1e9)
n = int(input())

m = int(input())

# broken :  고장난 버튼 저장 
broken = list(map(int,input().split()))

# answer : 현재 위치가 100이므로 최솟값은 +나 -로만 이동한 경우인 abs(100-n)이다. 
answer= abs(100-n)

# 채널 수가 무한대 이므로 1000001 까지 탐색
for i in range(1000001):

  for j in range(len(str(i))):
    # 숫자에 고장난 버튼이 포함되어 있으면 break
    if int(str(i)[j]) in broken: 
      break
    # 마지막까지 고장난 버튼이 없다면 
    elif j == len(str(i)) -1:
      # 현재 위치로 이동하기 위해 누른 버튼 수 + 현재 위치에서 +,-로 n까지 이동하는 거리와 answer 중 최솟값 갱신 
      answer = min(answer, len(str(i)) + abs(i-n))

print(answer)