알고리즘

백준 15724번 주지수 (JAVA)

박카스마시며코딩 2023. 5. 30. 19:06

https://www.acmicpc.net/problem/15724

 

15724번: 주지수

네모 왕국의 왕인 진경대왕은 왕국의 영토를 편하게 통치하기 위해서 1X1의 단위 구역을 여러 개 묶어서 하나의 거대 행정구역인 주지수(州地數, 마을의 땅을 셈)를 만들 예정이다. 진경대왕은

www.acmicpc.net

 

저는 DP를 통해 구간합을 구하고 이를 활용해 문제를 해결했습니다.

먼저 dp[i][j] = input[i][j] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] 를 통해 1,1 부터 i,j까지의 부분합을 구했습니다.

그리고 dp[endY][endX] - dp[startY-1][endX] - dp[endY][startX-1] + dp[startY-1][startX-1]를 통해 해당 구간 합을 출력하였습니다.

dp[i][j]는 1,1부터의 합이기 때문에 필요 없는 dp[startY-1][endX] , dp[endY][startX-1]이 부분들을 빼주고 dp[startY-1][startX-1]이 부분이 2번 뺴졌기 때문에 한번 더해주어 값을 찾았습니다

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_15724 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int m = stoi.apply(st.nextToken());
        int[][] input = new int[n+1][m+1];
        for(int i = 1 ; i <= n ; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 1 ; j <= m ; j++){
                input[i][j] = stoi.apply(st.nextToken());
            }
        }
        int[][] dp = new int[n+1][m+1];
        for(int i = 1 ; i <= n ; i++){
            for(int j = 1 ; j <= m ; j++){
                dp[i][j] = input[i][j] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
            }
        }
        int testCnt = stoi.apply(br.readLine());
        for(int t = 0 ; t < testCnt ; t++){
            st = new StringTokenizer(br.readLine());
            int startY = stoi.apply(st.nextToken());
            int startX = stoi.apply(st.nextToken());
            int endY = stoi.apply(st.nextToken());
            int endX = stoi.apply(st.nextToken());
            System.out.println(dp[endY][endX] - dp[startY-1][endX] - dp[endY][startX-1] + dp[startY-1][startX-1]);
        }
    }

}