Java/코딩테스트

[백준] 11659번 구간 합 구하기 4

soowitty 2024. 1. 29. 22:14

https://www.acmicpc.net/problem/11659

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j

www.acmicpc.net

 

 

Solution 1.

문제에서 0번째 배열을 1번째 배열이라고 지칭하고 있다.

따라서, 0번째 배열을 비워두고 1번째 부터 값을 채워나가면 로직이 더 간편해진다.

 

예제를 대입하여 그림으로 이해하는 것이 빠르다.

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());	// "5 3" 입력

        int N = Integer.parseInt(st.nextToken());	// N = 5
        int M = Integer.parseInt(st.nextToken());	// M = 3

        long [] arr = new long[N+1]; // 합 배열 선언	

        // ---- st에서 token을 다 꺼냈으므로 st는 비어있음!

        st = new StringTokenizer(br.readLine());    // st에 새로운 문자열 입력
        // st = "5 4 3 2 1"
        
        for(int i=1; i<=N; i++){	// 합 배열 arr에 값 저장
            arr[i] = arr[i-1] + Integer.parseInt(st.nextToken());
        }
        

        // ---- st에서 token을 다 꺼냈으므로 st는 비어있음!

       
        for (int q=0; q<M;q++){
            st = new StringTokenizer(br.readLine());	// 구간 입력

            int q1 = Integer.parseInt(st.nextToken());
            int q2 = Integer.parseInt(st.nextToken());

            System.out.println(arr[q2]-arr[q1-1]);
        }

    }
}

 

 

Solution 2.

그냥 0번째부터 값을 저장하면 아래와 같다.

1번 처럼 하는 것이 훨씬 간편함을 알 수 있다.

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException{

        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());

       	long [] arr = new long[N];  // 합 배열 선언

        // ---- st에서 token을 다 꺼냈으므로 st는 비어있음!

        st = new StringTokenizer(br.readLine());    // st에 새로운 문자열 입력
        // st = "5 4 3 2 1"
        for(int i=1; i<=N; i++){
            arr[i] = arr[i-1] + Integer.parseInt(st.nextToken());
        }
        for(int i=0; i<N; i++){
            if (i == 0) {
                arr[i] = Integer.parseInt(st.nextToken());
            }
            else{
                arr[i] = arr[i-1] + Integer.parseInt(st.nextToken());
            }

        }

        // ---- st에서 token을 다 꺼냈으므로 st는 비어있음!

        for(int q=0; q<M; q++){
            st = new StringTokenizer(br.readLine());
            int q1 = Integer.parseInt(st.nextToken());
            int q2 = Integer.parseInt(st.nextToken());
            if (q1 == 1){
                System.out.println(arr[q2-1]);
            }
            else{
                System.out.println(arr[q2-1] - arr[q1-2]);
            }

        }
    }
}

 

 

❓합 배열을 long형으로 선언한 이유

덧셈이나 곱셈 연산이 많을 때, int형으로 선언하면 범위를 초과하여 잘못된 값이 나올 수 있다.

따라서 long형으로 선언하는 것이 안전하다!

 

 

👩‍💻 BufferedReader, StringTokenizer 참고

https://happindex.tistory.com/26

 

Scanner보다 빠른 BufferedReader, StringTokenizer

BufferedReader는 Java.io에 속하는 입력 클래스로, Scanner에 비해 처리 속도가 빠르다. 때에 따라 2배 이상 차이 나는 경우도 있다. 알고리즘 문제를 풀 때 유용할 것!! Scanner Scanner sc = new Scanner(System.in);

happindex.tistory.com

 

'Java > 코딩테스트' 카테고리의 다른 글

[JAVA] 순열과 조합 구현하기  (1) 2024.03.29
[백준] 25916번 - 싫은데요  (1) 2024.02.16