1107 리모컨

DONGJIN IM·2022년 6월 28일
0

코딩 테스트

목록 보기
116/137

문제 이해

수빈이는 현재 100번 채널을 보고 있고, 채널 N번으로 이동하고 싶다.

+는 (채널+1)으로 이동하고, -를 누르면 (채널-1)로 이동한다.
또한 숫자를 눌러 특장 채널로 이동할 수도 있다.
이 때 숫자 자릿수만큼 버튼을 클릭하는 것으로 간주한다
(ex : 123을 클릭했다면 총 3번 버튼을 누르는 것으로 간주)

그런데 이 리모컨은 고장난 버튼이 있어서, 고장난 버튼을 클릭할 수는 없다.

이 경우 채널 N으로 이동할 때 최소 몇 번 버튼을 클릭해야하는지 구하는 문제이다.


문제 풀이

여기에서 가장 큰 문제는 "첫 번째에 몇 번 버튼을 누르는 것이 가장 적게 +, - 버튼을 누르면서 목적지로 갈 수 있는가"이다

그런데 이 첫 번째 버튼에 대한 명확한 알고리즘을 찾지는 못했다.

그래서 어쩔 수 없이 0 ~ 1000001 버튼을 클릭해보는 모든 상황을 확인해보았다.

  • 1000001인 이유 : 최댓값은 500000이다. 이 때 작은 수에서 큰 수로 이동할 수도 있지만 큰 수에서 작은 수로 이동할 수도 있기 때문에 500000의 2배인 1000000까지 한 번 Search해보는 것이다

코드

N = int(input())
error = int(input())
error_list = []
if error != 0:
    error_list = list(map(int, input().split()))

ans = abs(100 - N)

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

    for j in range(len(num)):
        if int(num[j]) in error_list:
        # 고장난 번호를 클릭한 경우이므로 고려하지 않음
            break

        elif j==len(num) - 1:
        # 고장나지 않은 번호로 num을 선택한 경우
        # (num ~ N까지 가는 거리 + num을 선택하는 데 필요한 버튼 개수)를 구한다
            ans = min(ans, abs(int(num)-N) + len(num))

print(ans)

결과

  • EOF Error이유 : error = 0이라면 error_list를 위한 input() 명령어는 필요 없는데, 이런 예외 상황을 입력하지 않아 EOF Error가 발생하였다.
profile
개념부터 확실히!

0개의 댓글

관련 채용 정보