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]);
}
}
}
'알고리즘' 카테고리의 다른 글
백준 18235번 지금 만나러 갑니다 (JAVA) (0) | 2023.06.01 |
---|---|
백준 2461번 대표 선수 (JAVA) (0) | 2023.05.31 |
프로그래머스 문자열 묶기 (JAVA) (0) | 2023.05.29 |
프로그래머스 배열의 원소 삭제하기 (JAVA) (0) | 2023.05.28 |
프로그래머스 문자 개수 세기 (JAVA) (0) | 2023.05.27 |