algorithm/BitManipulation
[백준22251/골5] 빌런 호석 - Python
ayeongjin
2025. 1. 2. 15:48
https://www.acmicpc.net/problem/22251
문제의 이미지 보고 비트연산으로 풀어야겠다고 생각했다.
근데 비트연산 제대로 써본적이 없음... 일단 비트 연산자 먼저 공부했다.
1. 껐다켰다 할 수 있는 LED는 총 7개 -> 7자리 이진수로 변환하여 나타냄
2. 1부터 N까지의 수를 하나씩 순회 -> 현재 K층의 숫자에서 몇개의 LED를 바꿔야하는지 계산 (XOR 연산)
3. 바꾼 LED를 세서 P개 이하라면 result += 1
실패 코드
# python 시간초과, pypy 2068ms
LED = {
"0": '1110111',
"1": '0010010',
"2": '1011101',
"3": '1011011',
"4": '0111010',
"5": '1101011',
"6": '1101111',
"7": '1010010',
"8": '1111111',
"9": '1111011'
}
N, K, P, X = map(int, input().split())
result = 0
for i in range(1, N+1):
floor = '0' * (K - len(str(i))) + str(i)
current = '0' * (K - len(str(X))) + str(X)
total_change = 0
if i == X:
continue
for j in range(K):
change = format(int(LED[floor[j]], 2) ^ int(LED[current[j]], 2), '07b').count("1")
total_change += change
if total_change > P:
break
if total_change <= P:
result += 1
print(result)
원인 : 비트를 문자열로 나타내서 더 오래걸림
성공 코드
# python 32544KB 3020ms, pypy 111496KB 1516ms
# 1~N 사이의 숫자로 바꾸기, K자리수, 최대 P개의 LED 반전, 실제 X층에 서있음
# 각 LED 번호 비트로 변환
# 각 자릿수 순회하면서 바꿔야하는 LED 수 구하고, P개 이하이면서 N이하의 수일 경우에 += 1
LED = {
"0": 0b1110111,
"1": 0b0010010,
"2": 0b1011101,
"3": 0b1011011,
"4": 0b0111010,
"5": 0b1101011,
"6": 0b1101111,
"7": 0b1010010,
"8": 0b1111111,
"9": 0b1111011
}
N, K, P, X = map(int, input().split())
result = 0
current = '0' * (K - len(str(X))) + str(X)
for i in range(1, N+1):
floor = '0' * (K - len(str(i))) + str(i)
total_change = 0
if i == X:
continue
for j in range(K):
change = bin(LED[floor[j]] ^ LED[current[j]]).count('1')
total_change += change
if total_change > P:
break
if total_change <= P:
result += 1
print(result)
이진수로 표현하니까 성공했다.