파괴되지 않은 건물
N x M 크기의 게임 맵이 있고, 각 칸에는 내구도를 가진 건물이 있다.
이 건물들을 skill들을 사용하여 건물들의 내구도를 변경시킨다.
최종적으로 건물들의 내구도가 1 이상인 갯수를 찾는다.
board
의 구간 (r1, c1) ~ (r2, c2)에 값을 N
을 채우고 싶다면 다음 4구역에 값을 다음과 같이 채운다.4x8
크기의 배열의 (0, 2) ~ (2, 5)
구간에 값 3
을 채우고 싶다.board[0][2], board[3][6]
에 값 3
, board[3][2], board[0][6]
에 값 -3
을 넣는다.row
를 고정하고 col
을 1
씩 증가시키며 이전 방문했을 때의 값을 더한다.
4) col
을 고정하고 row
를 1
씩 증가시키며 이전 방문했을 때의 값을 더한다.
5) 최종적으로 원하는 구역만큼 값을 채워 넣을 수 있다.
2. board[r1][c1], board[r2 + 1][c2 + 1] = N
, board[r1][c2 + 1], board[r2 + 1][c1] = -N
을 넣고, 가로로 이동하며 이전의 값을 누적, 세로로 이동하며 이전의 값을 누적시킨다.
3. 모든 skill
에 대해 sheet
를 미리 채워두고, 마지막에 누적합을 한번 하게 된다면 시간 복잡도 O(K + NM)
이 될 수 있다.
sheet
배열을 만들어 사용한다.skill
에 대해 반복하여 sheet
의 값을 채워둔다.skill
을 모두 사용한 후, sheet
테이블에 누적합(1-3 ~ 1-5)을 진행한다.board
에 내구도 변화량 sheet
를 더하여 결과값을 계산한다.def make_sheet(sheet: list, skill: list) -> list:
t, r1, c1, r2, c2, d = skill
if t == 1: d *= -1
sheet[r1][c1] += d
sheet[r1][c2 + 1] += d * -1
sheet[r2 + 1][c1] += d * -1
sheet[r2 + 1][c2 + 1] += d
def solution(board, skills):
answer = 0
sheet = [[0 for _ in range(len(board[0]) + 1)] for _ in range(len(board) + 1)]
for skill in skills:
make_sheet(sheet, skill)
for c in range(len(board[0])):
for r in range(1, len(board)):
sheet[r][c] += sheet[r - 1][c]
for r in range(len(board)):
for c in range(1, len(board[0])):
sheet[r][c] += sheet[r][c - 1]
for r in range(len(board)):
for c in range(len(board[0])):
board[r][c] += sheet[r][c]
if board[r][c] > 0:
answer += 1
return answer