[백준] 1107.리모컨

jeongjeong2·2023년 9월 20일
0

For coding test

목록 보기
57/59

문제 바로가기

문제 풀이

첫번째 코드를 구현할 때 각 자릿수를 누를 수 있는 버튼 중 그 차이가 가장 작은 값을 불러와서 정답을 내렸다. 그러나 테스트케이스7번과 같이 target channel보다 자릿수가 작은 경우가 답인 경우에는 오답이 발생했다.
해당 케이스를 따로 구현하려하다가 단순히 전체를 탐색했을 때 답을 구할 수 있음을 알 수 있었다.

정답 코드

첫번째 코드(unsolved) - about test_case7

"""
https://www.acmicpc.net/problem/1107
"""
# test_case 7번 해결
channel = 100
N = input()
M = int(input())
if M != 0:
    broken = set(map(int, input().split()))
else:
    broken = set([])
nums = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
buttons = list(nums - broken)
ans = []

for num in N:
    if int(num) in buttons:
        ans.append(0)
    else:
        ans.append(min(map(lambda x: abs(x - int(num)), buttons)))

answer = 0
for idx, i in enumerate(ans):
    answer += i * 10 ** (len(ans) - idx - 1)
print(min(answer + len(N), abs(int(N) - channel)))

두번째 코드(solved)

"""
https://www.acmicpc.net/problem/1107
"""
N=int(input())
M=int(input())
if M==0: broken=[]
else: broken=input().split()
answer=abs(100-N) # 현재 채널 100에서 그냥 옮길 때 누르는 횟수
for num in range(1000001): # 이동하려는 채널과는 별개로 채널은 무한히 존재한다
    for idx,i in enumerate(str(num)):
        if i in broken:
            break
        elif idx==len(str(num))-1: # num이 누를 수 있는 번호일 경우
            answer=min(answer,abs(N-num)+len(str(num)))
print(answer)

추가적인 개념 (optional)

때때로 안 풀릴 땐 완전 탐색도 시도해보기

EOF Error는 "End of File Error"의 줄임말로, 파일 또는 입력 스트림에서 더 이상 읽을 데이터가 없을 때 발생하는 오류를 나타낸다. M이 0일 때는 broken에 대한 입력이 발생하지 않는데 이 경우를 고려하지 않고 코드를 작성

다른 사람 코드 (optional)

두번째 풀이와 같다

0개의 댓글