백준 '리모콘'
문제 링크 및 문제 내용✏️
https://www.acmicpc.net/problem/1107
문제
수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.
리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.
수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.
수빈이가 지금 보고 있는 채널은 100번이다.
입력
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.
출력
첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.
테스트 케이스
예제 입력 1
5457
3
6 7 8예제 출력 1
6예제 입력 2
100
5
0 1 2 3 4예제 출력 2
0예제 입력 3
500000
8
0 2 3 4 6 7 8 9예제 출력 3
11117예제 입력 4
100
3
1 0 5예제 출력 4
0예제 입력 5
14124
0예제 출력 5
5예제 입력 6
1
9
1 2 3 4 5 6 7 8 9예제 출력 6
2예제 입력 7
80000
2
8 9예제 출력 7
2228풀이 코드👌
# 리모컨 현재보는 채널 100번
from itertools import product
# n(찾으려는 채널), m(고장난 버튼의 수)
n = int(input())
m = int(input())
answer = abs(n - 100) # 초기값
lenRange = len(str(n))  # 자릿수
# 최대가 6자리라서 범위처리 오류 방지
if lenRange == 6:
    lenRange = 5
# 예외 처리
if m != 0:
    errorButton = list(map(int,input().split()))
else:
    errorButton=[]
# 에러버튼 제외
remocon = [i for i in range(10) if i not in errorButton]
# 중복순열을 통해 경우의수 구하기
for i in range(lenRange + 1, 0, -1):
    comLi = list(product(remocon, repeat = i))  # 중복순열
# 중복순열 리스트 탐색
    for com in comLi:
        num = ''.join(map(str,com)) # 중복순열을 문자열로 변환
        num = int(num)  # 숫자로 변환
        Numlen = len(str(num))  # 현재 숫자의 길이
        answer = min(answer, abs(n - num) + Numlen) # 최소값 구하기
        
print(answer)
이렇게 풀었어요🔍
- 경우의 수를 구하는데 중복 순열을 사용하자
- 중복순열의 경우 범위가 넓기 때문에 최적화를 생각하자
Author And Source
                            
                            이 문제에 관하여(백준 '리모콘'), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://velog.io/@chobae/백준-리모콘
                            
                            
                            
                                저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
# 리모컨 현재보는 채널 100번
from itertools import product
# n(찾으려는 채널), m(고장난 버튼의 수)
n = int(input())
m = int(input())
answer = abs(n - 100) # 초기값
lenRange = len(str(n))  # 자릿수
# 최대가 6자리라서 범위처리 오류 방지
if lenRange == 6:
    lenRange = 5
# 예외 처리
if m != 0:
    errorButton = list(map(int,input().split()))
else:
    errorButton=[]
# 에러버튼 제외
remocon = [i for i in range(10) if i not in errorButton]
# 중복순열을 통해 경우의수 구하기
for i in range(lenRange + 1, 0, -1):
    comLi = list(product(remocon, repeat = i))  # 중복순열
# 중복순열 리스트 탐색
    for com in comLi:
        num = ''.join(map(str,com)) # 중복순열을 문자열로 변환
        num = int(num)  # 숫자로 변환
        Numlen = len(str(num))  # 현재 숫자의 길이
        answer = min(answer, abs(n - num) + Numlen) # 최소값 구하기
        
print(answer)Author And Source
이 문제에 관하여(백준 '리모콘'), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chobae/백준-리모콘저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)