[ BOJ / Python ] 1107번 리모컨

황승환·2022년 2월 23일
0

Python

목록 보기
199/498


이번 문제는 단순한 완전 탐색을 통해 해결할 수 있었다. 이동하고자 하는 채널의 최대 크기가 500,000이므로 9밖에 사용할 수 없는 경우, 즉 999,999부터 시작해야 되는 경우가 있으므로 1,000,000에 대하여 순회해야 한다. 순회해가며 그때마다 해당 숫자를 문자열로 변환하여 하나 하나씩 확인하고, 만약 고장난 버튼이 있을 경우 다음 반복으로 넘어가도록 하였고, 고장난 버튼이 없을 경우에는 가능한 최대값으로 저장해둔 answer를 현재 숫자의 자릿수와 현재 숫자-목표 숫자의 합과 answer 자기 자신 중 더 작은 값으로 갱신하도록 한다. 순회를 모두 마치게 되면 answer를 구할 수 있다. 이 문제에서는 예외처리가 필요했다. m이 0일 경우 고장난 버튼에 대한 입력이 주어지지 않기 때문에 이에 대하여 예외처리를 진행해주어야 한다.

  • n을 입력받는다.
  • m을 입력받는다.
  • 만약 m이 0이 아닐 경우, broken을 입력받는다.
  • m이 0일 경우, broken을 빈 리스트로 선언한다.
  • 정답을 저장할 변수 answer를 n-100의 절댓값으로 선언한다. (가능한 가장 큰 값)
  • 1,000,000번 반복하는 num에 대한 for문을 돌린다.
    -> num을 문자열로 변환한다.
    -> num의 길이만큼 반복하는 i에 대한 for문을 돌린다.
    --> 만약 num[i]의 정수형이 broken에 존재할 경우, 반복을 탈출한다.
    --> 그 외에는 answer를 answer과 abs(int(num)-n)+len(num) 중 더 작은 값으로 갱신한다.
  • answer를 출력한다.

Code

n=int(input())
m=int(input())
if m:
    broken=list(map(int, input().split()))
else:
    broken=[]
answer=abs(n-100)
for num in range(1000001):
    num=str(num)
    for i in range(len(num)):
        if int(num[i]) in broken:
            break
        elif i==len(num)-1:
            answer=min(answer, abs(int(num)-n)+len(num))
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글