백준1107(파이썬) - 리모컨

resilient

·

2021. 6. 11. 12:21

728x90
반응형

https://www.acmicpc.net/problem/1107

 

1107번: 리모컨

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

www.acmicpc.net

  • 먼저 이문제를 보고 첫 번째로 든 생각은 주어지는 n을 한자리씩 쪼개서 구현하는데에 사용해야 한다라는 것이였다. 처음에는 10으로 계속 나누어서 정수로 비교했지만 str(n)을 사용해서 문자열로 한자리씩 쉽게 사용할 수 있었다.
  • 그리고 든 생각은 탐색이긴한데 범위를 어디까지 해야할지 였다.
  • 그래서 생각한건 시간초과가 일단 날지라도, 주어진 n의 범위를 모두 완전탐색하는 가장 단순한 방법을 생각했다.
  • 500000까지 범위이지만, ++ 하는 경우와 --하는 경우를 더하면 총 1000000가지의 경우가 있었고 탐색을 하였다.
  • 탐색을 하면서 min으로 result값을 갱신해주면 어쨌든 가장 작은 수가 나오지 않을까 라는 생각이였는데
  • 시간초과가 발생하지않았고, 문제가 해결되었다 자세한건 아래 코드의 주석을 보면 된다.

`

import sys
input = sys.stdin.readline

n = int(input())
m = int(input())
broken = list(input().split())

# 리모컨으로 나올수있는 최솟값
result = 987654321

length = 0
# 완전탐색의 끝판왕. 숫자를 1000001까지 다 훑는다 -> 만들수있는숫자 -500000 ~ 500000 까지.
for number in range(1000001):
    # str 처리해서 하나하나 문자 처리해서 깨진 버튼인지 확인
    for j in str(number):
        if j in broken:
            # 깨진 버튼이면 for문 탈출.
            break
    # 안깨진 버튼들만 모였으면, 자릿수+현재비교중인숫자에서 n 값을 뺀 절댓값을 더해서 원래 값과 비교.
    else:
        result = min(result,len(str(number))+abs(number-n))
# 구해진 result 값하고, 최소가 될 수 있는 값하고 비교해준다. 
# (예를 들면 99 같은 경우 버튼 다 못쓰면 1만 빼주면되는 경우)
result = min(result,abs(100-n))
print(result)
반응형