https://school.programmers.co.kr/learn/courses/30/lessons/92344
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
def solution(board, skill):
n = len(board) # 행(row)의 개수
m = len(board[0]) # 열(column)의 개수
acc = [[0] * (m + 1) for _ in range(n + 1)] # 누적 합 계산용 배열 (board보다 가로, 세로 1칸 더 크게 만듦)
# 스킬 정보를 누적합 배열에 기록
for type_, r1, c1, r2, c2, degree in skill:
# 스킬 유형에 따라 가중치 설정 (1: 공격 -> -degree, 2: 회복 -> +degree)
change = degree if type_ == 2 else -degree
# 누적합 배열에 스킬의 시작점과 종료점을 반영
acc[r1][c1] += change # 스킬의 시작점
acc[r1][c2 + 1] -= change # 스킬 영향 끝나는 열 바로 다음에서 효과 제거
acc[r2 + 1][c1] -= change # 스킬 영향 끝나는 행 바로 다음에서 효과 제거
acc[r2 + 1][c2 + 1] += change # 영향을 끊기 위해 대각선 맞은편에 효과 제거
# 누적합 계산 (가로 방향)
for i in range(n + 1):
for j in range(1, m + 1):
# 현재 칸에 왼쪽 칸의 값을 더해서 누적합 계산
acc[i][j] += acc[i][j - 1]
# 누적합 계산 (세로 방향)
for j in range(m + 1):
for i in range(1, n + 1):
# 현재 칸에 위쪽 칸의 값을 더해서 누적합 계산
acc[i][j] += acc[i - 1][j]
# 최종 값 계산 및 건물의 상태 확인
answer = 0
for i in range(n):
for j in range(m):
# 누적합 배열에서 계산한 값을 원본 board에 반영
board[i][j] += acc[i][j]
# 건물이 파괴되지 않은 경우 (값이 0보다 크다면) 개수 증가
if board[i][j] > 0:
answer += 1
return answer
'코딩 테스트' 카테고리의 다른 글
코딩 테스트(Python) 프로그래머스 - 인사고과 (0) | 2025.02.03 |
---|---|
코딩 테스트(Python) 2021 KAKAO BLIND RECRUITMENT 합승 택시 요금 (1) | 2025.01.22 |
코딩 테스트(Python) 2020 KAKAO BLIND RECRUITMENT 자물쇠와 열쇠 (1) | 2024.12.20 |
코딩 테스트(Python) 순위 (0) | 2024.12.20 |
코딩 테스트(Python) 풍선 터트리기 (0) | 2024.12.20 |