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

유존돌돌이·2022년 1월 20일
0

Programmers

목록 보기
151/167
post-thumbnail

문제 설명

N x M 크기의 행렬 모양의 게임 맵이 있습니다. 이 맵에는 내구도를 가진 건물이 각 칸마다 하나씩 있습니다. 적은 이 건물들을 공격하여 파괴하려고 합니다. 건물은 적의 공격을 받으면 내구도가 감소하고 내구도가 0이하가 되면 파괴됩니다. 반대로, 아군은 회복 스킬을 사용하여 건물들의 내구도를 높이려고 합니다.
건물의 내구도를 나타내는 2차원 정수 배열 board와 적의 공격 혹은 아군의 회복 스킬을 나타내는 2차원 정수 배열 skill이 매개변수로 주어집니다. 적의 공격 혹은 아군의 회복 스킬이 모두 끝난 뒤 파괴되지 않은 건물의 개수를 return하는 solution함수를 완성해 주세요.

제한사항

1 ≤ board의 행의 길이 (= N) ≤ 100
1 ≤ board의 열의 길이 (= M) ≤ 100
1 ≤ board의 원소 (각 건물의 내구도) ≤ 100
1 ≤ skill의 행의 길이 ≤ 100
1 ≤ degree ≤ 100

Code

class Solution {
    public int solution(int[][] board, int[][] skill) {
        int m=board.length, n=board[0].length, ret=0;
		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) ret++;
			}
		}
		return ret;
    }
}

Comment

누적합 알고리즘에 대해 학습할 수 있는 알고리즘이었다.

0개의 댓글