본문 바로가기

백준 코딩 테스트

백준 1107번 - 리모컨

728x90

출처: 1107번: 리모컨 (acmicpc.net)

 

1107번: 리모컨

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

www.acmicpc.net

리모컨 성공분류

시간제한 메모리 제한 제출 정답 맞은 사람 정답 비율

2 초 256 MB 43181 10053 6856 22.395%

문제

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

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

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

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

입력

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

출력

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


[ 문제 설명 ]

 

첫 예제를 보시면 원하는 값 5457

제외되는 6, 7, 8 일 때

시작 번호 100번 일 때의 최솟값 6번이 나오는데

이것은 리모컨 숫자를 5번(1) 4번(2) 5번(3) 5번(4) +(5) +(6) 이런 메커니즘으로 6번의 최솟값을 얻은 것입니다.

자세한 설명은 그림으로 하겠습니다.

 

그림 1 - 리모컨 아이디어 설명
그림 2 - 리모컨 아이디어 설명

 


[ 코드 ]

 

n = int(input())
m = int(input())
buttons = {str(i) for i in range(10)}
newbutton = []

if m != 0:
    errbuttons = list(map(str, input().split(" ")))
    for i in buttons:
        if i not in errbuttons:
            newbutton.append(i)
else:
    newbutton = buttons

# print(newbutton)
# +,- 로 이동했는데 최소값일 경우
minCount = abs(100 - n)

for num in range(1000001):
    num = str(num)

    for j in range(len(num)):
        # print(j)
        if num[j] not in newbutton:
            break
        # j 가 len(num) - 1 이 된다는 경우는 원하는 수에 대해 리모콘이 다눌러졌다는 뜻
        elif j == len(num) - 1:
            # print(num)
            minCount = min(minCount, abs(n - int(num)) + len(str(num)))

print(minCount)

 


 

후기

 

역시 포스팅을 하면서

나한테 설명하면서 포스팅하면

이전의 이해에 비해서

좀 더 깊은 이해가 됩니다.

 

 

728x90

'백준 코딩 테스트' 카테고리의 다른 글

백준 9095번 - 1, 2, 3 더하기  (0) 2021.04.07
백준 1451번 - 직사각형으로 나누기  (0) 2021.04.07
백준 1476번 - 날짜 계산  (0) 2021.04.06
백준 1744번 - 수 묶기  (0) 2021.04.05
백준 11399번 - ATM  (0) 2021.04.05