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을 반환한다.
'Koala - 7기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/Python] 1895번 필터 (0) | 2022.07.10 |
---|---|
[백준/Python] 15666번: N과 M (12) (0) | 2022.07.10 |
[백준/Python] 1969번 DNA (0) | 2022.07.08 |
[BOJ / Python] 6603 - 로또 (0) | 2022.07.08 |
[백준/Python] 1895번 필터 (0) | 2022.07.07 |