BOJ 백준 9079번 동전게임 | Python
🔎 문제 설명
🩶 실버 2
- 난이도 ★★☆☆
- 그래프탐색 BFS & 비트마스킹
C언어 수업에서 동전 뒤집기 문제를 했던 기억이 나서 반가웠지만, 예상 외로 생각해야할 것이 꽤나 많았던 문제.
뒤집을 수 있는 모든 경우의 수를 how
에 넣어놓고 하나씩 돌려주었다.
0과 1로만 구성된 9자리의 수가 나오면, 이를 2진수라고 생각하고 10진수로 다시 바꿔주어서 해당 index의 방문 여부를 고려해주어 불필요한 계산을 줄였다.
✅ 10진수가
0
이거나511
이면 반복문 종료!
💻 내 코드
import sys
from collections import deque
input = sys.stdin.readline
T = int(input())
def game(coins: str):
visited = [0 for _ in range(512)]
how = [(0,1,2),(3,4,5),(6,7,8),
(0,3,6),(1,4,7),(2,5,8),
(0,4,8),(2,4,6)]
# 2진수 -> 10진수
queue = deque([(int(coins, 2), 0)])
visited[int(coins, 2)]=1
while queue:
coin, cnt = queue.popleft()
if coin == 0 or coin == 511:
return cnt
for h in how:
new = flip(list(bin(coin)[2:].zfill(9)), h)
idx = int(new, 2)
if not visited[idx]:
visited[idx] = 1
queue.append((idx, cnt + 1))
return -1
def flip(coin, how):
for h in how:
coin[h] = '1' if coin[h] == '0' else '0'
return ''.join(coin)
for t in range(T):
tmp = []
for i in range(3):
c = input().split()
tmp.append(''.join(['1' if ht=='H' else '0' for ht in c]))
print(game(''.join(tmp)))
💙 You need to log in to GitHub to write comments. 💙
If you can't see comments, please refresh page(F5).