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;
}
}
'알고리즘' 카테고리의 다른 글
프로그래머스 에어컨 (JAVA) (0) | 2023.08.12 |
---|---|
프로그래머스 택배 배달과 수거하기 (JAVA) (0) | 2023.08.11 |
프로그래머스 양궁대회 (JAVA) (0) | 2023.08.09 |
프로그래머스 신고 결과 받기 (JAVA) (0) | 2023.08.08 |
프로그래머스 주차 요금 계산 (JAVA) (0) | 2023.08.07 |