프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

PS/문제풀이

백준 22251 빌런 호석 Python

중규리 2024. 1. 23. 22:15

🐸 문제 정보

 

22251번: 빌런 호석

LED를 2개까지 바꿀 수 있을 때, 5층에서 3층, 6층, 8층, 그리고 9층으로 바꿔버릴 수 있다.

www.acmicpc.net

 

🤖 알고리즘

구현

 

⏱️ 풀이 시간

32.36m

 

📝 풀이

오랜만에 찐 구현 문제였다. 드디어...!!!

구현하면서 안써본 파이썬 메서드를 써봤는데 좋았다.

 

zip()

각 iterable에서 동일한 인덱스의 요소를 묶어서 튜플을 생성한다.

예를 들어, 두 개의 리스트를 zip으로 묶으면 각 리스트에서 같은 인덱스의 요소들이 순서대로 튜플로 묶이게 된다.

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']

# zip을 사용하여 두 리스트 묶기
zipped = zip(list1, list2)

# (1, 'a')
# (2, 'b')
# (3, 'c')

 

str.zfill()

문자열 왼쪽에 0을 추가해서 주어진 길이로 맞춘다.

number = 35
desired_length = 4

# 숫자를 원하는 자리수로 맞춘 뒤 문자열로 변경
result = str(number).zfill(desired_length)

# 0035

 

두 메서드를 유의하고, 구현하는 방식은 아래와 같다.

  1. LED의 각 위치에 인덱스를 부여하고, 0부터 9까지 각 전광판이 켜지는 부분을 0과 1로 구분해서 채워넣는다.
    • 본 포스팅에서 상정한 위치는 아래 이미지로 넣어놨다.
  2. 자리수에 맞춰놓은 현재 층수와, 자리수를 맞춰놓은 1부터 N까지 층수를 비교한다.
    • 모든 숫자를 돌면서 바꿔지는 개수를 체크하고, P보다 작다면 바꿀 수 있기 때문에 +1

LED 위치 별 인덱스

 

🧑‍💻 나의 답

# pypy3

import sys
input = sys.stdin.readline

nums = {}
nums[0] = [1, 1, 1, 0, 1, 1, 1]
nums[1] = [0, 0, 1, 0, 0, 1, 0]
nums[2] = [1, 0, 1, 1, 1, 0, 1]
nums[3] = [1, 0, 1, 1, 0, 1, 1]
nums[4] = [0, 1, 1, 1, 0, 1, 0]
nums[5] = [1, 1, 0, 1, 0, 1, 1]
nums[6] = [1, 1, 0, 1, 1, 1, 1]
nums[7] = [1, 0, 1, 0, 0, 1, 0]
nums[8] = [1, 1, 1, 1, 1, 1, 1]
nums[9] = [1, 1, 1, 1, 0, 1, 1]

n, k, p, x = list(map(int, input().rstrip().split()))
x = str(x).zfill(k)
res = 0

def find_change(p, n):
    p, n = int(p), int(n)
    return sum(x != y for x, y in zip(nums[p], nums[n]))

for tn in range(1, n + 1):
    num = str(tn).zfill(k)
    temp = 0
    for i in range(k):
        temp += find_change(x[i], num[i])
    if (num != x) and (temp <= p):
        res += 1

print(res)