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