코딩테스트/[JAVA] 백준

[백준 | JAVA | 11659번] 구간합 구하기

냠냠쿠 2023. 11. 5. 10:06
728x90
https://www.acmicpc.net/problem/11659

 

📝 유튜브 풀이

https://www.youtube.com/watch?v=JSfXW7UJ04Y&list=PLFgS-xIWwNVU_qgeg7wz_aMCk22YppiC6&index=3

👉구간합 구하기 개념

  1. N개의 수를 입력 받음과 동시에 합 배열을 생성
    S[i] = S[i-1] + A[i]

  2. 구간 i~j가 주어지면 구간 합을 구하는 공식으로 정답을 출력
    S[j] - S[i-1]
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 bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        //bufferedReader.readLine()을 받는 것은 예제 첫번째 줄을 읽어왔다는 것.
        
        int suNo = Integer.parseInt(stringTokenizer.nextToken());
        //숫자의 개수 
        		
        int quizNo = Integer.parseInt(stringTokenizer.nextToken());
        // 질의의 개수 
        
        long[] S = new long[suNo+1];
        // 덧셈이나 곱셈이 많을 때 int형으로 선언 시 오류가 날 수 있기 때문에 습관적으로 long형을 선언하는 것이 좋음
        // suNo+1 을 한 이유는 배열은 인덱스 0 번을 무시하고 1번부터 사용할 것이기 때문
        
        stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        
        for(int i=1; i<=suNo; i++) {
        	S[i]= S[i-1] + Integer.parseInt(stringTokenizer.nextToken());
        }
        
        for(int q=0; q<quizNo; q++) {
        	stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        	
        	int i = Integer.parseInt(stringTokenizer.nextToken());
        	//첫 번째 나오는 숫자를 i로 가져온다.
        	
        	int j = Integer.parseInt(stringTokenizer.nextToken());
        	//두 번째 나오는 숫자를 j로 가져온다.
        	
        	System.out.println(S[j]-S[i-1]);
        }
	}
}
  • 받는 데이터가 많을 때에는 scanner보다 bufferedReader를 쓰는것이 더 좋다.
    한줄에 길게 데이터를 받을 때에는 int보다 토큰으로 분리하여 사용하는 것이 좋다.

 

📝 나의 풀이

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
        
        //숫자 개수 
        int N = scanner.nextInt();
        
        //합을 구해야 하는 횟수 
        int M = scanner.nextInt(); 
        
        int[] arr = new int[N+1];
        
        //구간합 구하기
        for(int i=1; i<=N; i++) {
        	arr[i] = arr[i-1]+scanner.nextInt();
        }
       
        for(int i=0; i<M; i++) {
        	int a = scanner.nextInt();
        	int b = scanner.nextInt();
        	System.out.println(arr[b]-arr[a-1]);
        }
	}
}
728x90