Koala - 7기/코딩테스트 준비 스터디

[백준/Python] 1107번 리모컨

sheeeep 2022. 7. 9. 13:21

https://www.acmicpc.net/problem/1107

문제 분석

 

 

코드

n = int(input())
brokenNum = int(input())
brokenList = list()
if (brokenNum == 0):
    answerList = [abs(n - 100), len(str(n))]
    print(min(answerList))

elif (brokenNum == 10):
    brokenList = list(input().split())
    print(abs(n - 100))

else:
    brokenList = list(input().split())
    numList = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

    numList = list(set(numList) - set(brokenList))

    numList.sort()

    answerList = [abs(n - 100)]

    plus = 0 + n
    minus = 0 + n


    def makalbe(n):
        for i in range(len(str(n))):
            if(str(n)[i:i+1] not in numList):
                return False
        return True
    for i in range(answerList[0]):
        plus = n + i
        minus = n - i
        if (makalbe(minus)):
            answerList.append(len(str(minus)) + abs(minus - n))
            break
        if(makalbe(plus)):
            answerList.append(len(str(plus))+abs(plus-n))
            break
        
    print(min(answerList))

문제풀이

1. 고장난 버튼의 개수가 0이라면, 모든 버튼을 누를 수 있으니 100에서 해당 채널로 +- 버튼을 이용해 이동한 경우와 해당 채널의 번호를 눌러 이동한 경우 중 작은 값을 출력한다.

2. 고장난 버튼의 개수가 10이라면(모든 버튼 고장), +-버튼을 이용해 이동한 경우를 출력한다.

3. 고장난 버튼의 개수 1이상 10미만일 때,

  • 100에서 +-로 이동한 경우를 answerList에 넣는다.
  • 최대 위에서 넣은 값까지, 목표 채널에서 +와 -를 한번씩 누른다.
  • makable 함수를 이용해 위에서 이동한 채널을 버튼을 눌러 이동할 수 있는지 확인한다. 이동 가능하다면, answerList에 (해당 채널의 자릿수 + 해당 채널과 목표 채널의 차이)를 넣고 반복문을 중단한다.
  • 최종적으로 answerList중 가장 작은 값을 출력한다.

4. makable함수

  • 입력된 채널의 각 자리의 수를 보며, 현재 고장나지 않은 리모컨으로 이동할 수 있는 채널이면 1을 반환한다. 아니면 0을 반환한다.