함량 100%

함지의 개발일기

알고리즘/브루트포스

[백준/브루트포스] 1107 리모컨(Python, 파이썬)

Haamjee 2021. 5. 11. 22:58

www.acmicpc.net/problem/1107

 

1107번: 리모컨

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

www.acmicpc.net

숫자버튼을 누르고, 그 다음 +나 -중 하나만 연속해서 눌러야한다.

이 때, 숫자버튼을 눌러 가야하는 채널을 정해야하는데 이때 브루트포스 방법으로 구현하면 된다.

 

1. 이동할 채널 C를 정한다.

2. C에 포함되어 있는 숫자 중에 고장난 버튼이 있는지 확인한다.

  - 수를 10으로 계속해서 나누면서 하나씩 검사

3. 고장난 버튼이 포함되어 있지 않다면 |C-N|을 계산해 +나 -버튼을 몇 번 눌러야 하는지를 계산한다.

 

import sys
input = sys.stdin.readline
MAX = 1000000

btn=[False] * 10
ch = int(input())
m = int(input())
a = list(map(int, input().split()))

for x in a:
    btn[x] = True

# 이동하려고 하는 채널까지 숫자를 눌러 이동 가능할 때, 
# 누르는 버튼의 개수를 반환
def possible(ch):
    if ch == 0:
        if btn[0]:
            return 0
        else:
            return 1
    len = 0
    while ch > 0:
        if btn[ch%10]:
            return 0
        len += 1
        ch //= 10
    return len

# 가장 처음에 보고 있는 채널은 100이기 때문에
# 초기값을 100에서 숫자 버튼을 누르지 않고 이동하는 횟수로 지정
answer = abs(ch - 50)

# 이동 가능한 모든 버튼을 검사
for i in range(100):
    len = possible(i)
    print(i, len)

    # 숫자를 눌러서 갈 수 있는 경우
    if len > 0:
        press = abs(i-ch) # +나 - 버튼을 몇 번 눌러야 하는지

        if answer > len + press:
            answer = len + press
print(answer)