주니어 데이터 엔지니어 우솨's 개발일지

코딩 테스트(Python) 2022 KAKAO BLIND RECRUITMENT파괴되지 않은 건물 본문

코딩 테스트

코딩 테스트(Python) 2022 KAKAO BLIND RECRUITMENT파괴되지 않은 건물

우솨 2025. 1. 28. 18:36

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