11660번: 구간 합 구하기 5
첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네
www.acmicpc.net
틀린 코드 (시간초과)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class B11660_구간합구하기2 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int [][] arr = new int[N+1][N+1];
int [][] S = new int[N+1][N+1];
for(int i=1;i<N+1;i++) {
st = new StringTokenizer(bf.readLine());
for(int j =1;j<N+1;j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
S[i][j] = S[i][j-1] + arr[i][j]; //누적합
}
}
System.out.println(Arrays.deepToString(arr));
System.out.println(Arrays.deepToString(S));
}
}
생각해본 방법
1. 도형을 나눠서 빼고 더하고
(3,4) 빨강 = 주황 - (노랑+초록) + (노랑과 초록의 합집합 = 1,1)
문제는 각 자리의 합 (누적합)을 구하고 이 방법을 실행하는 것이었다.
(모름)
정답 => 다이나믹 알고리즘을 쓰자!
🔔🔔🔔🔔🔔🔔🔔🔔🔔🔔
위의 두가지의 생각을 합치면 정답이 된다...
정답 코드 : 다이나믹 알고리즘 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class B11660_구간합구하기5 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int [][] arr = new int[N+1][N+1];
for(int i=1;i<N+1;i++) {
st = new StringTokenizer(bf.readLine());
for(int j =1;j<N+1;j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
int dp[][] = new int[N+1][N+1];
for(int x=1;x<N+1;x++) {
for(int y =1;y<N+1;y++) {
dp[x][y] = dp[x][y-1]+dp[x-1][y]-dp[x-1][y-1] +arr[x][y];
}
}
for(int i=0;i<M;i++) {
st = new StringTokenizer(bf.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
int sum = dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1];
System.out.println(sum);
}
}
}
'코딩 연습 > 백준' 카테고리의 다른 글
[JAVA] B2961_도영이가 만든 맛있는 음식 (0) | 2023.03.15 |
---|---|
[JAVA] B2164_카드 2 (0) | 2023.03.10 |
[JAVA] B17608_막대기 (0) | 2023.03.10 |
[JAVA] B2018_수들의합5 (0) | 2023.03.09 |
[백준 11021] A+B - 7 (0) | 2021.03.03 |