[백준/Python] 1107 리모컨

알고리즘 - 리모컨

Posted by Kyun2da on September 23, 2020

1️⃣ 서론

백준 문제 1107번 리모컨 입니다. 파이썬(Python)으로 풀었습니다.

2️⃣ 문제 설명

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어집니다.

둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어집니다.

고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없습니다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있습니다.

+를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동합니다.

채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있습니다.

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

3️⃣ 풀이

이 문제는 이동하려고 하는 채널이 500,000까지 이므로 누를 수 있는 채널을 모두 조사한 다음,

해당 채널에서 N까지 얼마만큼 + 또는 - 를 해야 갈 수 있을 지를 구해 가장 최소의 횟수를 구하면 됩니다.

채널이 500,000 까지이기 때문에 최악의 경우는 100번에서 모든 번호를 누를 수 없고 + 버튼으로 500,000까지 가는 499,900번 입니다.

따라서, 버튼을 약 1,000,000 번까지 누를수 있게 검사를 한다면 최악의 경우까지 전부 검사가 가능합니다.

그럼 브루트 포스를 수행한 코드를 보시겠습니다.

4️⃣ 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
n = int(input())

m = int(input())
if m != 0:
    arr = list(map(int, input().split()))
else:
    arr = []
num = 100

ans = abs(n - 100)
for i in range(1000001):
    numArr = list(str(i))
    flag = False
    # 숫자를 누를 수 있는 지 검사
    for k in numArr:
        if int(k) in arr:
            flag = True
            break

    if flag:
        continue
    # 해당 숫자를 누를 수 있다면 n까지 가는 방법 + 숫자를 누른횟수를 구해서 비교한다.
    else:
        ans = min(ans, abs(n - i) + len(str(i)))

print(ans)

5️⃣ 마치며..

질문과 지적은 환영합니다. 이 문제는 최적의 정답일 수도 아닐수도 있습니다.
궁금한게 있으시면 아래 댓글 남겨주세요.🙏
댓글은 저에게 큰 힘이 됩니다!
감사합니다. ❤️