오답노트

[브루트포스] BOJ 1107 리모컨 본문

Python/코딩테스트

[브루트포스] BOJ 1107 리모컨

권멋져 2023. 5. 4. 18:01

문제

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

 

1107번: 리모컨

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

www.acmicpc.net

풀이

틀린 풀이

어렵게 풀려고 했다. 채널에 가까운 작은 수와 큰 수를 찾았는데 너무 처리해야할 예외가 많았다.

그래서 멘탈이 터져서 포기..

 

import sys

N = sys.stdin.readline().rstrip()
M = int(sys.stdin.readline())

if M > 0:
    btn_list = list(map(int,sys.stdin.readline().split()))
else:
    btn_list = []

int_N = int(N)


if int_N == 100:
    print(0)
else:
    if abs(int_N - 100) < 3:
        print(2)
    else:
        if len(btn_list) == 10:
            print(abs(int_N - 100))
        elif len(btn_list) == 0:
            print(len(N))
        else:
            min_btn, max_btn = 9,0
            for k in range(0,10):
                if k in btn_list:
                    continue
                min_btn = min(k,min_btn)
                max_btn = max(k,max_btn)

            cnt = 0
            cnt_1 = 0
            cnt_2 = 0
            tmp = ''
            tmp_1 = ''
            tmp_2 = ''

            for i in range(len(N)):
                n = N[i]
                if int(n) in btn_list:
                    num = -1
                    pre = 10

                    # 작은 수 부터
                    for k in range(10):
                        if k in btn_list:
                            continue
                        if abs(int(n) - k) < pre:
                            pre = abs(int(n) - k) 
                            num = k

                    if i != 0 or num != 0 or len(N) == 1:
                        tmp_1 = tmp
                        cnt_1 = cnt

                        tmp_1 += str(num)
                        cnt_1 += 1
           
                        idx = i
                        while idx < len(N)-1:
                            idx += 1
                            tmp_1 += str(max_btn)
                            cnt_1 += 1
                    
                    # 큰 수 부터
                    num = -1
                    pre = 10
                    for k in range(9,-1,-1):
                        if k in btn_list:
                            continue
                        if abs(int(n) - k) < pre:
                            pre = abs(int(n) - k) 
                            num = k

                    if i != 0 or num != 0 or len(N) == 1:
                        tmp_2 = tmp
                        cnt_2 = cnt

                        tmp_2 += str(num)
                        cnt_2 += 1

                        idx = i
                        while idx < len(N)-1:
                            idx += 1
                            tmp_2 += str(min_btn)
                            cnt_2 += 1
                        
                        break

                    
                else:
                    tmp += n
                    cnt += 1


            if tmp_1 and tmp_2:
                cnt_1 += abs(int_N - int(tmp_1))
                cnt_2 += abs(int_N - int(tmp_2))
                print(min(cnt_1,cnt_2))
            else:
                print(cnt_1)

정답

별거 없다 0부터 죄다 뒤져보는거다.

N = int(input())
M = int(input())

brokens = []
if M:
    brokens = input().split()


def check(n):
    strN = str(n)

    for s in strN:
        if s in brokens:
            return False
    return True


res = abs(100-N) # +,- 만 이용해서 채널을 찾을때

for i in range(1000000):
    if check(i):
        res = min(res, len(str(i))+abs(i-N)) 
        # 망가지지 않은 버튼으로 수를 만들 때 누른 횟수 + 그 수에서 +,-로 채널을 찾을 때
        

print(res)

'Python > 코딩테스트' 카테고리의 다른 글

[브루트포스] BOJ 18111 마인크래프트  (0) 2023.05.04
[DP] BOJ 10942 팰린드롬?  (1) 2023.04.13
[DP] BOJ 12865 평범한 배낭  (0) 2023.04.05
[DP] BOJ 9251 LCS  (4) 2023.04.05
[Heap] 프로그래머스 - 디스크 컨트롤러  (0) 2023.04.02