문제 제목, 난이도
1107번 : 리모컨, 골드5
문제 링크
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼
www.acmicpc.net
코드(Python)
import sys
input = sys.stdin.readline
n = int(input())
m = int(input())
ava = []
available = [True] * 11
if m != 0 :
li = list(map(int,input().split()))
for i in li :
available[i] = False
for i in range(0, 10) :
if available[i] == True :
ava.append(i)
ans = abs( 100 - n )
for i in range(0, 1000000) :
tmp = True
i_str = str(i)
for j in i_str :
if available[int(j)] == False :
tmp = False
break
if tmp == True :
ans = min(ans, abs(i - n) + len(str(i)))
print(ans)
풀이
고장난 버튼의 개수가 0 이면 고장난 버튼 리스트를 입력받지 않습니다.
초기값은 +, - 버튼만을 이용해서 이동하는 방법입니다.
0부터 1,000,000 까지 숫자에 대하여 각 자리수가 available 한 숫자들로 이루어져 있는지 확인하고 한 자리라도 사용 불가능한 경우 다음 숫자를 확인하고, 모든 숫자가 available 할 경우 그 채널 숫자를 누르는 버튼 카운트 ( len(str(i)) ) 와 + 또는 - 버튼을 누르는 카운트를 더한 다음 지금까지의 값과 비교합니다.
n의 범위가 0 <= n <= 500,000 이었기 때문에 999,999 에서 500,000에 접근할 경우가 i 값의 최대라고 판단하여 1,000,000 까지 루프를 돌렸습니다.
체크리스트
브루트포스
처음에는 목표 채널을 스트링으로 변환해서 각 자릿수를 다루는 방법으로 접근해보려고 했는데, 진행할수록 반례가 많아지길래 방식을 바꿨다.
제한시간이 2초라서 1000000 * 숫자 버튼의 수 10 을 해도 한참 시간이 남아서 (1억을 1초라 하면) 범위의 숫자를 하나씩 다 체킹해도 정답처리를 받을 수 있는 문제이다.
백만개의 값을 갖는 boolean 리스트를 만들고 전부 available 한 숫자로 이루어져있는지 확인해서 True , False 값을 준 다음 리스트의 인덱스 i 에서 왼쪽 오른쪽으로 한 칸씩 확인하면서 값이 True인 인덱스를 찾는 방법도 있을 수 있겠다. 이 방법을 쓰면 찾았을 때 min 연산을 한 번만 쓰면 될 듯 ?
리모콘은 새로 사자
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ / Python] 11286번 : 절댓값 힙 (0) | 2021.07.10 |
---|---|
[BOJ / Python] 14500번 : 테트로미노 (0) | 2021.05.14 |
[BOJ / Python] 10026번 : 적록색약 (0) | 2021.05.11 |
[BOJ / Python] 16928번 : 뱀과 사다리 게임 (0) | 2021.05.01 |