PS
마법사 상어와 파이어 스톰 [삼성 기출]
깊게 생각하고 최선을 다하자
2023. 10. 8. 23:41
1. 문제 접근 방법
- 격자판을 나누어서, 격자판을 회전시킨 후에, 얼음의 양을 줄이는 것을 반복하는 문제이다.
이 때 중요한 것은 격자판을 정확하게 회전시키는 것이다.
-> rotate 함수에 주목하자
-> rotate 함수에서 4차원 for문을 활용해서 회전을 시켰다.
2. 내 코드
from collections import deque
import copy
N, Q = map(int, input().split())
board = []
for i in range(2**N):
row = list(map(int, input().split()))
board.append(row)
magics = list(map(int, input().split()))
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
biggestIce = 0
iceCnt = 0
visited = [[False]*(2**N) for _ in range(2**N)]
def rotate(N, L):
global board
N = 2**N
L = 2**L
tmpBoard = copy.deepcopy(board)
for x in range(0, N, L):
for y in range(0, N, L):
for i in range(L):
for j in range(L):
board[x+j][y+L-i-1] = tmpBoard[x+i][y+j]
def melt():
global board
tmpBoard = [[0]*(2**N) for _ in range(2**N)]
for i in range(0, 2**N):
for j in range(0, 2**N):
ice = board[i][j]
cnt = 0
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0<=nx and nx < 2**N and 0<=ny and ny<2**N:
if board[nx][ny] > 0:
cnt += 1
else:
continue
if cnt >= 3:
tmpBoard[i][j] = ice
continue
else:
if ice >= 1:
tmpBoard[i][j] = ice - 1
board = copy.deepcopy(tmpBoard)
def getIceSum():
sum = 0
for i in range(0, 2**N):
for j in range(0, 2**N):
sum += board[i][j]
return sum
for L in magics:
rotate(N, L)
melt()
total = getIceSum()
def bfs(x, y, visited):
global iceCnt
visited[x][y] = True
iceCnt += 1
q = deque()
q.append([x,y])
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx and nx<2**N and 0<=ny and ny<2**N and board[nx][ny] != 0 and visited[nx][ny] == False:
visited[nx][ny] = True
iceCnt += 1
q.append([nx, ny])
for i in range(2**N):
for j in range(2**N):
if board[i][j] != 0 and visited[i][j] == False:
iceCnt = 0
bfs(i, j, visited)
biggestIce = max(biggestIce, iceCnt)
print(total)
print(biggestIce)