알고리즘

프로그래머스 파괴되지 않은 건물 (JAVA)

박카스마시며코딩 2023. 8. 10. 16:50

https://school.programmers.co.kr/learn/courses/30/lessons/92344

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

저는 2차원 누적합을 통해 문제를 해결했습니다.

누적합을 통해 해당 구간에 얼마를 더해야하는지를 저장하였고, board와 더해서 양수라면 answer을 하나 늘리면서 문제를 해결하였습니다.

 

class Solution {
    private static final int ATTACK = 1;
    private static final int HEAL = 2;
    public int solution(int[][] board, int[][] skill) {
        int answer = 0;
        int n = board.length;
        int m = board[0].length;
        int[][] prefixSum = new int[n][m];
        for(int[] intArr : skill){
            int type = intArr[0];
            int r1 = intArr[1];
            int c1 = intArr[2];
            int r2 = intArr[3];
            int c2 = intArr[4];
            int degree = intArr[5];
            if(type == ATTACK){
                degree *= -1;
            }
            prefixSum[r1][c1] += degree;
            if(c2 + 1 < m){
                prefixSum[r1][c2+1] -= degree;
            }
            if(r2 + 1 < n){
                prefixSum[r2+1][c1] -= degree;
            }
            if(r2 + 1 < n && c2 + 1 < m){
                prefixSum[r2+1][c2+1] += degree;
            }
        }
        for(int i = 0 ; i < n ; i++){
            int sum = 0;
            for(int j = 0 ; j < m ; j++){
                sum += prefixSum[i][j];
                prefixSum[i][j] = sum;
            }
        }
        for(int i = 0 ; i < m ; i++){
            int sum = 0;
            for(int j = 0 ; j < n ; j++){
                sum += prefixSum[j][i];
                prefixSum[j][i] = sum;
            }
        }
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < m ; j++){
                if(board[i][j] + prefixSum[i][j] > 0){
                    answer++;
                }
            }
        }
        return answer;
    }
}