[프로그래머스] 파괴되지 않은 건물
https://school.programmers.co.kr/learn/courses/30/lessons/92344
누적합
을 구해 해결한다.DP 방식
으로 한번에 누적합을 구한다.BaaaaaaaarkingDog
님 블로그에 자세히 설명되어있다.출처: BaaaaaaaarkingDog
https://blog.encrypted.gg/1031
check
배열을 생성해 누적합을 구한다.누적합을 구한 배열(check)
과 원본 배열(board)
의 각 위치 값을 더해 파괴되지 않은 건물의 개수를 구한다.def solution(board, skill):
answer = 0
row_len = len(board) # 행 길이
col_len = len(board[0]) # 열 길이
# 누적합 기록해 놓을 배열 --> 각 모서리 기록할 때 범위 벗어날 수 있어서 크기를 각각 +1 해줌
check = [[0 for _ in range(col_len + 1)] for _ in range(row_len + 1)]
# 명령을 순서대로 처리
for command in skill:
attack, r1, c1, r2, c2, degree = command
# 적 공격 -> -degree
if attack == 1:
# 누적 차(?)를 구해야 하므로 왼쪽 위, 오른쪽 아래는 (-degree) 해줌
check[r1][c1] -= degree
check[r2 + 1][c2 + 1] -= degree
# 왼쪽 아래, 오른쪽 위는 (+degree) 해줌
check[r2 + 1][c1] += degree
check[r1][c2 + 1] += degree
# 아군 힐 -> +degree
elif attack == 2:
# 누적 합을 구해야 하므로 왼쪽 위, 오른쪽 아래는 (+degree) 해줌
check[r1][c1] += degree
check[r2 + 1][c2 + 1] += degree
# 왼쪽 아래, 오른쪽 위는 (-degree) 해줌
check[r2 + 1][c1] -= degree
check[r1][c2 + 1] -= degree
# 가로로 누적합
for i in range(row_len):
for j in range(col_len):
check[i + 1][j] += check[i][j]
# 세로로 누적합
for j in range(col_len):
for i in range(row_len):
check[i][j + 1] += check[i][j]
# 원본 배열과 누적합 배열을 합치며 정답 계산
for i in range(row_len):
for j in range(col_len):
value = board[i][j] + check[i][j]
if value > 0:
answer += 1
return answer