1 분 소요

백준 (BOJ) 1107
https://www.acmicpc.net/problem/1107

사용언어 : PYTHON

1.문제

image

2.풀이

2-1. 시도했다가 실패한 풀이

image
N : 5457
M : 3
고장난 버튼 : [5,7] 이면
입력이 가능한 버튼들은 [0,1,2,3,4,5,6,8,9]이다.

5457의 첫 번째 숫자 5가 없으므로 첫 번째 숫자를 4 혹은 6을 입력하는 것이 최소로 이동할 수 있는 수가 될 것이다.

이 때 4를 입력한 경우는 뒤에 숫자를 최대한 큰 수로 입력해야 하고, 6을 입력한 경우는 최대한 작은수를 입력해야 한다고 생각하여 문제를 풀고자 했다.

2-2. 올바른 풀이

브루트포스 알고리즘

0 ~ 999899+1 까지 리모컨으로 입력할 수 있는 모든 숫자들을 비교하며 최솟값을 찾는다.


N의 범위는 500000까지 이지만 999899까지 비교하는 이유

N=500000, 입력할 수 있는 버튼이 [8,9]일때

100에서 500000까지 + 버튼으로만 이동하는 횟수 = 499900

999899에서 500000까지 - 버튼으로만 이동하는 횟수 = 499899

999899에서 -버튼으로 이동하는 횟수가 정답이 된다.

즉 더 큰 값에서 -버튼으로 이동하는 횟수도 고려하기 위해서 범위를 999899까지 잡았다.

3.코드

초기 최솟값은 100과 목푯값(N)을 +혹은 -버튼으로만 이동하는 횟수 (abs(100-N))으로 뒀다.

0~999899까지의 숫자 중 고장난 버튼이 포함된 숫자가 나올 경우 flag변수를 0으로 바꾸고 반복문을 빠져나온다.

flag변수가 1인경우(=입력할 수 있는 숫자인 경우)는 최솟값을 비교하고 갱신하여 준다.

import sys
import math
input = sys.stdin.readline

N=int(input())
M=int(input())

if M>0:
    err_btn=list(map(int,input().split()))
else:
    err_btn=[]
    
min_input=abs(100-N)

for num in range(999900):
    flag=1
    num = str(num)
    
    for i in num:
        if int(i) in err_btn:
            flag=0
            break
    
    if flag==1:
        min_input=min(min_input,abs(int(num)-N)+len(num))

print(min_input)

댓글남기기