https://www.acmicpc.net/problem/2167
- 예제 입력1
2 3
1 2 4
8 16 32
3
1 1 2 3
1 2 1 2
1 3 2 3
- 예제 출력1
63
2
36
- 문제 접근
- 첫째줄에는 2차원 배열의 크기가 주어짐 (N행 M열)
- 둘째줄에는 2차원 배열의 값이 주어짐
- 셋째줄에는 합을 구할 케이스가 주어짐
- 넷째줄부터 누적 합을 할 좌표 가 주어짐[i , j] ~ [x, y]
- 배열의 합이 2$^3$$^1$-1이하 이므로 int로 표현 가능
- 문제 해결
- start X ~ end X, startY ~ endY 이중 반복문
- 슈도 코드
N(행 저장), M(열 저장)
A[N+1][M+1] 배열 선언
for(N번 반복){
for(M번 반복){
A 배열 초기화
}
}
K(케이스 개수 저장)
for(K번 반복){
startX, startY, endX, endY (입력 저장)
sum (누적합)
for(i = startX ~ endX)
for(j = startY ~ endY)
sum += A[i][j]
sum 출력
}
- 코딩하기
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] A = 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++){
A[i][j] = Integer.parseInt(st.nextToken());
}
}
int K = Integer.parseInt(br.readLine());
for(int k = 0; k < K; k++){
st = new StringTokenizer(br.readLine());
int startX = Integer.parseInt(st.nextToken()), startY = Integer.parseInt(st.nextToken());
int endX = Integer.parseInt(st.nextToken()), endY = Integer.parseInt(st.nextToken());
int sum = 0;
for(int i = startX; i <= endX; i++){
for(int j = startY; j <= endY; j++){
sum += A[i][j];
}
}
System.out.println(sum);
}
}
'Coding Test > Problem Number' 카테고리의 다른 글
[Java] 방 번호 [2740번] (0) | 2024.07.18 |
---|---|
[Java] 행렬 곱셈 [2740번] (0) | 2024.07.18 |
[Java] 수들의 합5 [2018번] (0) | 2024.07.18 |
[Java] 수들의 합2 [2003번] (0) | 2024.07.18 |
[Java] 참외밭 [2477번] (0) | 2024.07.17 |