브루트포스 - 1107번: 리모컨

jisu_log·2025년 9월 2일

알고리즘 문제풀이

목록 보기
95/105

  • permus = list(permus) -> 제너레이터를 list로 변환하면 모두 메모리에 올라가서 메모리 초과남 주의!! list 변환 없이 제너레이터 그대로 순회하면 됨!
  • elem_cnt = abs(N - num) + i -> 두 수의 차이(+ or - 눌러야 하는 횟수) 계산 후 꼭 i 더하기! (해당 숫자를 만들기 위해 i번 버튼을 누르는 것이므로)
# 현재 채널 100번 -> N번으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는가?
from itertools import product

N = int(input())

M = int(input())

num_list = set()
num_list.update(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"])
remain_list = []


if M != 0:
    broken_list = set(map(str, input().split()))

    # 0~9에서 입력받은 숫자들 제외하기
    remain_list = num_list - broken_list
# M이 0인 경우 리스트 입력 없음 주의
else:
    remain_list = num_list

# 사용 가능한 번호 리스트
remain_list = list(remain_list)
remain_list.sort()

min_cnt = 0

# [1] 100에서 +, -눌러서 이동하기
min_cnt = abs(100 - N)


# [2] 번호 새로 입력하고, +,- 눌러서 이동하기
N_str = str(N)
N_len = len(N_str)


# 1) N(목표 채널)의 길이가 2 이상인 경우
if N_len >= 2:

    # N_len - 1, N_len, N_len + 1 자릿수의 가능한 모든 수 구하기
    for i in range(N_len - 1, N_len + 2):

        # 현재 최소값보다 자리수 i 가 같거나 더 크다면 볼 필요 X (어차피 최소값이 될 수 없음)
        if i >= min_cnt:
            continue

        # 중복 순열!
        permus = product(remain_list, repeat=i)
        # permus = list(permus) # 제너레이터를 list로 변환하면 모두 메모리에 올라가서 메모리 초과남 주의!! list 변환 없이 제너레이터 그대로 순회하면 됨!

        for elem in permus:
            # 각 조합을 정수로 변환하기
            elem_list = list(elem)
            elem_list = "".join(elem_list)

            num = int(elem_list)

            # 두 수의 차이(+ or - 눌러야 하는 횟수) 계산 후 꼭 i 더하기! (해당 숫자를 만들기 위해 i번 버튼을 누르는 것이므로)
            elem_cnt = abs(N - num) + i

            # 최소값 갱신
            if elem_cnt < min_cnt:
                min_cnt = elem_cnt
# 2) N의 길이가 1인 경우
else:

    # N_len, N_len + 1 자릿수의 가능한 모든 수 구하기
    for i in range(N_len, N_len + 2):

        # 현재 최소값보다 자리수 i 가 같거나 더 크다면 볼 필요 X (어차피 최소값이 될 수 없음)
        if i >= min_cnt:
            continue

        # 중복 순열!
        permus = product(remain_list, repeat=i)
        # permus = list(permus) # 제너레이터를 list로 변환하면 모두 메모리에 올라가서 메모리 초과남 주의!! list 변환 없이 제너레이터 그대로 순회하면 됨!

        for elem in permus:
            # 각 조합을 정수로 변환하기
            elem_list = list(elem)
            elem_list = "".join(elem_list)

            num = int(elem_list)

            # 두 수의 차이(+ or - 눌러야 하는 횟수) 계산 후 꼭 i 더하기! (해당 숫자를 만들기 위해 i번 버튼을 누르는 것이므로)
            elem_cnt = abs(N - num) + i

            # 최소값 갱신
            if elem_cnt < min_cnt:
                min_cnt = elem_cnt

print(min_cnt)

0개의 댓글