이호진

백준 1107 - 리모컨 - 2021/04/09 본문

백준문제풀이

백준 1107 - 리모컨 - 2021/04/09

이호진 2021. 4. 9. 15:36

문제 설명

 

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

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

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

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

 

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

 

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

 

풀이

 

우선 최솟값을 n-100의 절댓값으로 해두고 for문에서 최솟값을 계속 비교한다.

값이 500,000까지 들어올 수 있기 때문에 for문의 범위를 1,000,000으로 한다.

( ex) 값이 499,999일 때, 1 2 3 4 5가 고장이라면 0부터 500,000까지 +를 누르는것이 아니라 600,000에서 100,000번 -를 눌러야한다.)

 

for 문 안에서 값이 num에 들어있는 값인지 비교하고 아니라면 break로 그 부분을 건너뛴다.

그리고 나머지 num에 있는 값들중에선 자리수가 같다면 그 길이와 n에서 값을 뺀 절댓값을 더해 최솟값과 비교한다.

 

 

n = int(input())
m = int(input())
num = {str(i) for i in range(10)}
if m > 0:
    num -= set(map(str, input().split()))
current = 100
mn = abs(n - current)
for i in range(1000000):
    for j in range(len(str(i))):
        if str(i)[j] not in num:
            break
        elif len(str(i)) - 1 == j:
            mn = min(mn, len(str(i)) + abs(n - i))
print(mn)

 

코드로 보면 별거 아닌거같지만 생각해야할게 꽤 많은 문제였다.

 

우선 for문의 범위가 500,000이 아니라 1,000,000으로 해야하고 누를 수 있는 번호 중 값을 비교하는 부분이 꽤 어렵다.

그리고 최솟값을 비교하는데서도 len(str(i))-1 == j 이 부분을 생각하는게 꽤 어려운 문제인것 같다.