자바 백준 11660번
실버 1
https://www.acmicpc.net/problem/11660
문제 보기

분류: 다이나믹 프로그래밍, 누적 합
코드 풀이
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 표의 크기 N과, 합을 구할 쿼리의 수 M 입력 int N = sc.nextInt(); int M = sc.nextInt(); // N×N 크기의 표를 입력받기 위해 배열 초기화 // 1-based 인덱스를 사용하기 위해 N+1 크기의 배열로 선언 int[][] arr = new int[N + 1][N + 1]; // 표의 각 값들을 입력받고 arr 배열에 저장 for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { arr[i][j] = sc.nextInt(); } } // 누적합 배열을 계산 int[][] prefixSum = calculatePrefixSum(N, arr); // StringBuilder를 사용하여 결과를 한번에 출력할 수 있도록 준비 StringBuilder sb = new StringBuilder(); // 각 쿼리에 대해 (x1, y1)부터 (x2, y2)까지의 합을 구하고 출력 for (int i = 0; i < M; i++) { int x1 = sc.nextInt(); // 쿼리 시작 x1 int y1 = sc.nextInt(); // 쿼리 시작 y1 int x2 = sc.nextInt(); // 쿼리 끝 x2 int y2 = sc.nextInt(); // 쿼리 끝 y2 // getSum 함수로 (x1, y1)부터 (x2, y2)까지의 합 계산 int result = getSum(x1, y1, x2, y2, prefixSum); // 결과를 StringBuilder에 추가 (출력 시 한번에 출력) sb.append(result).append("\n"); } // 결과 출력 System.out.print(sb.toString()); } // 누적합 계산 메서드 // 주어진 배열 arr를 이용하여 prefixSum 배열을 계산해서 반환 private static int[][] calculatePrefixSum(int N, int[][] arr) { int[][] prefixSum = new int[N + 1][N + 1]; // (1, 1)부터 (i, j)까지의 합을 구하는 방식으로 누적합 배열 계산 for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { // 현재 위치까지의 합 = arr[i][j] + (왼쪽 + 위쪽) - (왼쪽 위 교차 영역) prefixSum[i][j] = arr[i][j] + prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1]; } } return prefixSum; } // 특정 범위 (x1, y1)부터 (x2, y2)까지의 합을 구하는 메서드 private static int getSum(int x1, int y1, int x2, int y2, int[][] prefixSum) { // 범위 합을 구하는 공식을 적용 return prefixSum[x2][y2] - prefixSum[x1 - 1][y2] - prefixSum[x2][y1 - 1] + prefixSum[x1 - 1][y1 - 1]; } }
'공부하기 > 백준' 카테고리의 다른 글
[Java] 백준 풀기 6322 - 직각 삼각형의 두 변 (0) | 2025.01.18 |
---|---|
[Java] 백준 풀기 8723 - Patyki (2) | 2024.12.27 |
[Java] 백준 풀기 17608 - 막대기 (2) | 2024.12.08 |
[Java] 백준 풀기 4458 - 첫 글자를 대문자로 (0) | 2024.11.26 |
[Java] 백준 풀기 5554 - 심부름 가는 길 (2) | 2024.11.24 |