Algorithm/문제풀이

[Python][백준] 1107_리모컨

Deveun 2021. 6. 6. 00:05

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

 

1107번: 리모컨

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

www.acmicpc.net

더보기

문제

수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.

수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오. 

수빈이가 지금 보고 있는 채널은 100번이다.

 

입력

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

 

출력

첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.


완전탐색(Brute force)하면서 이동하려는 N에서 가장 가까운 선택할 수 있는 채널 번호를 찾았다.

단, 100에서 +,- 버튼만으로 N까지 도달하는 횟수와 비교하여 더 최소값을 구했다.

(처음에는 리모컨의 누를 수 있는 번호로 조합을 만들어서 값을 계산하려고 했었는데, 조건추가하고 예외처리하고.... 점점 코드가 누더기가 되어 결국 reset. 그냥 N에서 --1,++1 해가면서 값을 찾으면 되는거였는데..) 

import sys

def check(num):

    res = list(filter(lambda x: int(x) in broken, str(num)))
    return True if len(res) == 0 else False

## MAIN
N = int(sys.stdin.readline())
M = int(sys.stdin.readline())
broken = list(map(int, sys.stdin.readline().split()))
minNum = abs(N-100)

for r in range(500000):

    if r > minNum:
        break

    minus = N - r
    plus = N + r

    if minus >= 0:
        if(check(minus)):
            minNum = min(minNum, len(str(minus)) + r)
            break
    if plus <= 999999:
        if(check(plus)):
            minNum = min(minNum, len(str(plus)) + r)
            break

print(minNum)