Coding - Algo/Java
[백준] 11660번:구간 합 구하기5(Java 자바)
jainn
2021. 12. 6. 00:24
728x90
문제
https://www.acmicpc.net/problem/11660
11660번: 구간 합 구하기 5
첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네
www.acmicpc.net
풀이 및 소스코드
이 문제는 N이 1024이고, 부분합을 100,000번 구해야 함
그때그때 부분합을 구하게 되면 n^2(1024*1024)*m(100,000) => 시간초과
따라서 dp로 풀어야 한다.
https://subbak2.tistory.com/65
[BOJ 백준] 구간 합 구하기 5(11660) Java
링크 : https://www.acmicpc.net/problem/11660 문제 설명 : 더보기 N×N개의 수가 N×N 크기의 표에 채워져 있다. (x1, y1)부터 (x2, y2)까지 합을 구하는 프로그램을 작성하시오. (x, y)는 x행 y열을 의미한다...
subbak2.tistory.com
이 분께서 설명을 아주 잘해주셨다 !!!
이해가 안되면 이거 보면 될 듯!!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] map = new int[n+1][n+1];
for(int i=1;i<=n;i++) {
st = new StringTokenizer(br.readLine());
for(int j=1;j<=n;j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// 구간 합 dp에 저장
int[][] dp = new int[n+1][n+1];
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+map[i][j];
}
}
int x1, y1, x2, y2;
for(int mm=0;mm<m;mm++) {
st = new StringTokenizer(br.readLine());
x1= Integer.parseInt(st.nextToken());
y1= Integer.parseInt(st.nextToken());
x2= Integer.parseInt(st.nextToken());
y2= Integer.parseInt(st.nextToken());
sb.append(dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]).append("\n");
}
System.out.println(sb);
}
}
반응형