728x90
https://school.programmers.co.kr/learn/courses/30/lessons/92344
이것이 누적합이다 !! 를 보여주는 문제이다 ㅋㅋㅋ
단순하게 구현하면 시간초과가 나므로 누적합을 이용하여 degree 값을 미리 계산해두고 board에 더해주면 된다.
def solution(board, skill):
answer = 0
n = len(board) # col
m = len(board[0]) # row
dp = [[0] * (m+1) for _ in range(n+1)]
for t, r1, c1, r2, c2, degree in skill:
if t == 1: # 공격
degree *= (-1) # minus 값으로 변경
# dp 에 표시해두기
dp[r1][c1] += degree # 영향 받기 시작하는 부분
dp[r1][c2+1] -= degree # degree 영향 범위 아닌 부분
dp[r2+1][c1] -= degree # degree 영향 범위 아닌 부분
dp[r2+1][c2+1] += degree # 두번 빼주는 부분 다시 더해주기
# 누적합 계산하기 , 세로 방향
for i in range(n):
for j in range(m):
dp[i+1][j] += dp[i][j]
for i in range(n):
for j in range(m):
dp[i][j+1] += dp[i][j]
# 파괴되지 않은 건물
for i in range(n):
for j in range(m):
if board[i][j] + dp[i][j] > 0:
answer += 1
return answer
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 1261번: 알고스팟 (Python) - 0-1 BFS 탐색 (0) | 2023.10.29 |
---|---|
[Programmers] 표현 가능한 이진트리 - Python (1) | 2023.10.23 |
[백준] 9466번: 텀 프로젝트 (DFS|Python) - 그래프에서 cycle을 찾기 (0) | 2023.10.15 |
[백준] 10986번: 나머지 합 (Python) - 메모리 초과와 누적합 (0) | 2023.09.29 |
[프로그래머스] 상담원 인원 - Python (0) | 2023.09.17 |