맛있는물회

[맛있는물회] <백준 알고리즘> 1107번 "리모컨" 본문

IT/알고리즘

[맛있는물회] <백준 알고리즘> 1107번 "리모컨"

맛있는물회 2020. 5. 30. 23:25

문제 조건


수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.

수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오. 

수빈이가 지금 보고 있는 채널은 100번이다.

 

Input


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

Output


첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.

 

생각한 아이디어


브루트포스 중에 브루트 포스 중에 부르트 포스이다.

 

솔직히 2초라도 이 코드가 실행가능할지 의문이 들 정도로 많은 시간을 요하는 코드인데 이렇게 푸는 것같다.

 

먼저 처음에는 중복순열의 길이를 target channal 의 길이만큼 만 돌았는데 생각해보니 그게 아닐 수 도있다는 것...

그래서 최대값인 500000의 길이 6부터 1까지 모든 길이를 기준으로 하여 중복순열을 돌았다.

 

고장난 채널을 제외한 채널값의 리스트를 기준으로 중복 순열을 수행하여서 모든 값의 비교를 진행했다!

 

쉽지않다!

 

소스코드


#1107 리모컨

from itertools import product

if __name__ == "__main__":
   num=int(input())
   m=int(input())
   if m!=0:
      arr=list(map(int,input().split()))
   else:
      arr=[]
   cur = 100
   answer=abs(num-cur)

   channel=[i for i in range(0,10) if i not in arr]
   for i in range(6,0,-1):
      for val in product(channel,repeat=i):
         tmp = ''.join(list(map(str,val)))
         tmp=int(tmp)
         length=len(str(tmp))
         if answer>(length+abs(num-tmp)):
            answer=(length+abs(num-tmp))

   print(answer)

 

*파이썬 문법 정리

Comments