문제
풀이
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
먼저 해당 좌표가 유효한 좌표인지 확인하는 함수를 작성했다.
def bomb(x, y, b_type):
bomb_shapes = [
[],
[[-2, 0], [-1, 0], [0, 0], [1, 0], [2, 0]],
[[-1, 0], [1, 0], [0, 0], [0, -1], [0, 1]],
[[-1, -1], [-1, 1], [0, 0], [1, -1], [1, 1]]
]
for i in range(5):
dx, dy = bomb_shapes[b_type][i];
nx, ny = x + dx, y + dy
if in_range(nx, ny):
bombed[nx][ny] = True
폭탄을 종류에 따라 터뜨리고 기록하는 함수이다.
def calc():
for i in range(n):
for j in range(n):
bombed[i][j] = False
for i in range(n):
for j in range(n):
if bomb_type[i][j]:
bomb(i, j, bomb_type[i][j])
cnt = 0
for i in range(n):
for j in range(n):
if bombed[i][j]:
cnt += 1
return cnt
터진 폭탄의 영역을 계산하는 함수이다.
폭탄이 터진 위치 배열을 초기화하고
각 폭탄 타입에 따라 초토화 되는 영역을 표시한다.
그 후 초토화된 영역의 수를 구해서 cnt에 저장한다.
def find_max_area(cnt):
global ans
if cnt == len(bomb_pos):
ans = max(ans, calc())
return
for i in range(1, 4):
x, y = bomb_pos[cnt]
bomb_type[x][y] = i
find_max_area(cnt + 1)
bomb_type[x][y] = 0
for i in range(n):
given_row = list(map(int, input().split()))
for j, bomb_place in enumerate(given_row):
if bomb_place:
bomb_pos.append((i, j))
시뮬레이션하는 함수이다.
배치할 수 있는 모든 공간에 폭탄을 배치했다면 calc함수를 사용해서 터지는 공간을 계산하여 갱신한다.
아니라면 1, 3의 폭탄을 백트래킹하며 배치한다.
코드
# 변수 선언 및 입력:
n = int(input())
bomb_type = [
[0 for _ in range(n)]
for _ in range(n)
]
bombed = [
[False for _ in range(n)]
for _ in range(n)
]
ans = 0
bomb_pos = list()
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
def bomb(x, y, b_type):
bomb_shapes = [
[],
[[-2, 0], [-1, 0], [0, 0], [1, 0], [2, 0]],
[[-1, 0], [1, 0], [0, 0], [0, -1], [0, 1]],
[[-1, -1], [-1, 1], [0, 0], [1, -1], [1, 1]]
]
# 격자 내 칸에 대해서만 영역을 표시합니다.
for i in range(5):
dx, dy = bomb_shapes[b_type][i];
nx, ny = x + dx, y + dy
if in_range(nx, ny):
bombed[nx][ny] = True
def calc():
for i in range(n):
for j in range(n):
bombed[i][j] = False
for i in range(n):
for j in range(n):
if bomb_type[i][j]:
bomb(i, j, bomb_type[i][j])
cnt = 0
for i in range(n):
for j in range(n):
if bombed[i][j]:
cnt += 1
return cnt
def find_max_area(cnt):
global ans
if cnt == len(bomb_pos):
ans = max(ans, calc())
return
for i in range(1, 4):
x, y = bomb_pos[cnt]
bomb_type[x][y] = i
find_max_area(cnt + 1)
bomb_type[x][y] = 0
for i in range(n):
given_row = list(map(int, input().split()))
for j, bomb_place in enumerate(given_row):
if bomb_place:
bomb_pos.append((i, j))
find_max_area(0)
print(ans)
'알고리즘' 카테고리의 다른 글
[코드트리 파이썬] 양수 직사각형의 최대 크기 (0) | 2024.03.09 |
---|---|
[코드트리 파이썬] 회의실 겹치지 않게 하기 (0) | 2024.03.07 |
[코드트리 파이썬] 1차원 바람 (0) | 2024.03.02 |
[코드트리 파이썬] 금 채굴하기 (0) | 2024.02.29 |
[백준 파이썬] 1068 트리 (0) | 2024.02.26 |