본문 바로가기
Problem Solving/BOJ

[BOJ][Python]1107번 풀이

by NoiB 2022. 3. 1.
반응형

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

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

n = int(input())
result = abs(100 - n)
m = int(input())
if m == 0:
    b = []
else:
    b = input().split()
for i in range(1000001):
    for j in str(i):
        if j in b:
            break
    else:
        result = min(result, len(str(i)) + abs(i - n))
print(result)

이번 문제는 개인적으로 많이 파고들었던 문제입니다. 완전탐색을 사용하지 않고 풀어보려고 했었거든요. 근데 주구장창 시간만 계속 흐르다보니 지쳐서 브루트포스로 풀게 됐네요. 참고로 숫자 범위를 500,000이 아닌 1,000,000까지 잡는 이유는 낮은 숫자에서 올라가는 것 보다 큰 숫자에서 내려오는게 빠른 경우가 있기 때문입니다. n의 범위는 500,000 이지만 가령 1,2,3,4,5 가 누르지 못하는 숫자일 때 처음 숫자인 100에서 올라가는 것 보다는 600,000에서 내려오는게 더 빠른 것 처럼요.

 

참고로 백준에서 지원하는 컴파일러에 문제가 있는지 if m != 10: 이라고 조건식을 사용하면 무조건 틀렸다고 나오는 경우가 있습니다. 몇 번이고 바꿔가면서 해봤는데 안돼요. 0이면 입력을 받지 않는 것으로 조건을 바꾸면 됩니다.

 

실패했던 코드도 올려보겠습니다.

import sys
ssr = sys.stdin.readline

def make_num(n):
    num = ''
    if btn == []:
        return 100000000
    else:
        for i in range(len(n)):
            k = abs(int(n[i])-btn[0])
            last=btn[0]
            for j in btn:
                if abs(int(n[i])-j)<=k:
                    k = abs(int(n[i])-j)
                    last=j
            num += str(last)
            if n[i]!=num[i]:
                if n[i]> num[i]:
                    for _ in range(len(n)-1-i):
                        num += str(btn[(len(btn)-1)])
                    break
                else:
                    for _ in range(len(n)-1-i):
                        num += str(btn[0])
                    break
    return int(num)

btn = [0,1,2,3,4,5,6,7,8,9]
n = ssr().rstrip()
m = int(ssr())
if m == 0:
    _=0
else:
    b = list(map(int, ssr().split()))
result = abs(int(n)-100)
for i in range(m):
    btn.remove(b[i])
num = make_num(n)
result1 = abs(int(n)-num)+len(str(num))
if result < result1:
    print(result)
else:
    print(result1)

글을 적다보니 다시금 떠오른 생각이 있습니다만 언제 다시 이걸 손댈지는 모르겠네요. 문제 자체는 어렵지 않았는데 고집을 피우다 보니 늦어졌습니다. 항상 장점이자 단점이라고 생각합니다만 기분탓인지 요근래에는 계속 단점일 때가 많은 것 같아요. 더 안좋은 기억이니 오래 남는지도 모르겠지만요.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]15841번 풀이  (0) 2022.05.18
[BOJ][Python]1769번 풀이  (0) 2022.05.18
[BOJ][Python]1074번 풀이  (0) 2022.02.24
[BOJ][Python]백준 1012 풀이  (0) 2022.02.23