반응형
https://www.acmicpc.net/problem/1107
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 |