문제
https://www.acmicpc.net/problem/1107
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼
www.acmicpc.net
문제 요약
이동하려는 채널과 고장난 버튼들을 입력 받고, 해당 채널로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지 출력한다.
+ 현재 채널은 100번이다.
코드
import sys
input = __import__('sys').stdin.readline
N = int(input()) # 이동하려는 채널
M = int(input()) # 고장난 버튼 개수
broken = list(map(int, input().rstrip().split()))
min_cnt = abs(100 - N)
# 현재 채널 100번에서 + 또는 - 만 사용하여 이동하는 경우
# 이 반복문은 숫자 버튼을 통해 num을 거쳐서 원하는 채널로 이동하는 경우를 체크한다.
for num in range(1000001):
# 채널은 무한대이기 때문에 500000이 최대가 아님
num = str(num)
for i in range(len(num)):
if int(num[i]) in broken:
# 고장난 숫자가 있으면 break
break
elif i == len(num) - 1:
# 고장난 숫자 없이 마지막 자리까지 왔다면 (num이 리모콘으로 직접 입력 가능한 숫자인 경우)
min_cnt = min(min_cnt, abs(int(num) - N) + len(num))
# 채널 num과 목표 채널과의 차이(+, -로 움직일 횟수) + num의 길이(num으로 이동할 때 버튼을 누를 횟수)
# 이전 최소 횟수와 비교하여 업데이트
print(min_cnt)
코드 설명
1. 최악의 상황은 리모콘의 리모콘의 모든 숫자 버튼이 고장난 상황이다.
(현재 채널에서 +, - 버튼만 사용하여 원하는 채널 N으로 이동해야한다.)
=> 결과 값 min_cnt을 일단 (100 - N)의 절댓값으로 설정한다. (절댓값은 N이 100보다 큰 상황 고려)
2. 모든 채널 0부터 1000001까지 직접 하나씩 체크하며 min_cnt값을 업데이트 시켜준다.
(이동하려는 채널의 수는 0부터 500000까지 이지만, 전체 채널의 수는 무한대이므로)
+ 이 반복문은 숫자 버튼을 통해 num을 거쳐서 원하는 채널로 이동하는 경우를 체크한다.
3. 체크한 채널의 모든 자릿수에 고장난 숫자가 없다면 (리모콘으로 직접 입력 가능한 숫자인 경우)
3-1. min 함수를 통해 이전까지 가장 최소 입력 횟수 min_cnt와 비교하여 업데이트한다.
++ 목표 채널과 체크하고 있는 채널의 차이 (+, - 버튼으로 움직일 횟수) + 체크하고 있는 채널의 자릿수 (숫자 버튼을 누를 횟수)가 체크한 채널을 거쳐서 원하는 채널로 이동할 때 최소한 눌러야하는 버튼 횟수이다.
'Algorithm Problems > 완전 탐색' 카테고리의 다른 글
[백준/python] 15684번: 사다리 조작 (2) | 2023.08.09 |
---|---|
[백준/python] 15663번: N과 M (9) (2) | 2023.08.08 |
[백준/python] 9963번: N-Queen (2) | 2023.08.04 |
[백준/python] 16955번: 오목, 이길 수 있을까? (2) | 2023.08.03 |
[백준/python] 15655번: N과 M (6) (4) | 2023.08.02 |