리모컨 성공분류
시간제한 메모리 제한 제출 정답 맞은 사람 정답 비율
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번의 최솟값을 얻은 것입니다.
자세한 설명은 그림으로 하겠습니다.
[ 코드 ]
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)
후기
역시 포스팅을 하면서
나한테 설명하면서 포스팅하면
이전의 이해에 비해서
좀 더 깊은 이해가 됩니다.
'백준 코딩 테스트' 카테고리의 다른 글
백준 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 |