알고리즘/누적합

2022 KAKAO BLIND RECRUITMENT - 파괴되지 않은 건물

naksnaks 2022. 6. 5.
반응형

[문제링크]

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

 

코딩테스트 연습 - 파괴되지 않은 건물

[[5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5]] [[1,0,0,3,4,4],[1,2,0,2,3,2],[2,1,0,3,1,2],[1,0,1,3,3,1]] 10 [[1,2,3],[4,5,6],[7,8,9]] [[1,1,1,2,2,4],[1,0,0,1,1,2],[2,2,0,2,0,100]] 6

programmers.co.kr


[설명]

이 문제는 완전탐색으로 풀었는데 효율성에서 통과하지 못하였습니다.

찾아보니 다른분들께서 누적합으로 풀은 것을 볼 수 있습니다.

 

누적 합으로 푸는 방법

1) sum이라는 배열을 만든다.(board의 세로 길이가 M, 가로 길이가 N일 때, sum = new int[M+1][N+1] 로 선언을 해야한다. 그 이유는 누적합을 할 때, 끝점에서 +1한 점도 누적합에 포함해야 하기 때문이다.)

2) 좌->우로 누적합을 적용합니다.

3) 상->하로 누적합을 적용합니다.

4) 원래 값인 board에 sum배열을 합친 것이 0보다 클 경우 answer를 ++해준다.

 

 

프로그래머스 2022 KAKAO BLIND RECRUITMENT - 파괴되지 않은 건물 JAVA풀이

 

class Solution {
    public int solution(int[][] board, int[][] skill) {
        int answer = 0;
        int M=board.length, N=board[0].length;
        int[][] sum = new int[M+1][N+1];
        //누적합 좌표
        for(int[] s : skill){
            int i1=s[1], j1=s[2];
            int i2=s[3], j2=s[4];
            int d=s[5]*(s[0]==1?-1:1);
            sum[i1][j1]+=d;
            sum[i2+1][j1]+=d*-1;
            sum[i1][j2+1]+=d*-1;
            sum[i2+1][j2+1]+=d;
        }
        // 좌 -> 우
        for(int j=1;j<N;j++){
            for(int i=0;i<M;i++){
                sum[i][j]+=sum[i][j-1];
            }
        }
        // 상 -> 하
        for(int i=1;i<M;i++){
            for(int j=0;j<N;j++){
                sum[i][j]+=sum[i-1][j];
            }
        }
        // 누적합
        for(int i=0;i<M;i++){
            for(int j=0;j<N;j++){
                if(board[i][j]+sum[i][j]>0)answer++;
            }
        }
        
        return answer;
    }
}

 

 

 

궁금하신 부분이나 부족한 점은 댓글로 알려주시면 감사하겠습니다.

 

반응형

'알고리즘 > 누적합' 카테고리의 다른 글

BJ_G5_3020_개똥벌레 - Java  (0) 2022.06.06
BJ_S3_2559_수열 - Java  (0) 2022.06.06

댓글

💲 추천 글