1 λΆ„ μ†Œμš”

πŸ“ [S3_11659] ꡬ간 ν•© κ΅¬ν•˜κΈ°4

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static StringTokenizer st;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		st = new StringTokenizer(br.readLine(), " ");
		
		// 개수
		int N = Integer.parseInt(st.nextToken());
		
		// 횟수
		int M = Integer.parseInt(st.nextToken());
		
		int[] arr =new int[N+1];
		int[] sum = new int[N+1];
		sum[0] = 0;
		
		st = new StringTokenizer(br.readLine(), " ");
		for(int i=1; i<N+1; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
            // ν•© κ΅¬ν•˜κΈ° 
			sum[i] = arr[i] + sum[i-1];
		}
		
		
		for(int i=0; i<M; i++) {
		st = new StringTokenizer(br.readLine(), " ");
		
		// μ‹œμž‘κ³Ό 끝
		int start = Integer.parseInt(st.nextToken());
		int end = Integer.parseInt(st.nextToken());
		
        // 전체 합을 λΉΌκΈ°
		int res = 0;
		start -= 1;
		res = sum[end] - sum[start];
		
		sb.append(res).append("\n");
		
		}
		
		// 좜λ ₯
		System.out.println(sb);
	}
}

πŸ€” λ‚˜μ˜ 생각

μ²˜μŒμ— μ‹œκ°„λ³΅μž‘λ„λ₯Ό μ•ˆλ³΄κ³  바보같이 쉽닀고 for문으둜 κ·Έλƒ₯ ν’€μ—ˆλ‹€.. γ…‹γ…‹γ…‹γ…‹
for문으둜 μ°ΎλŠ”κ°’ μ‹œμž‘κ°’μ—μ„œ 끝값 κΉŒμ§€ λ‹€ λ”ν•΄μ£ΌλŠ” μ‹μœΌλ‘œ. μ œμΆœν–ˆλŠ”λ° ν•œλ™μ•ˆ 채점이 진행이 μ•ˆλ˜κΈΈλž˜ .. μ„€λ§ˆ? γ…‹γ…‹ λ„ˆλ¬΄μ‰½κΈ΄ν–ˆλ‹€ μ΄λŸ¬λ©΄μ„œ λ‹€μ‹œ λŒμ•„κ°”λ‹€.
λŒμ•„κ°€μ„œ λ³΄λ‹ˆ 100000 κ°œμ΄λ‹€..γ…‹γ…‹γ…‹ 무쑰건 μ‹œκ°„μ΄ˆκ³Ό.. O(N^2) μ΄μ˜€μœΌλ‹ˆ 1μ΄ˆμ•ˆμ—λŠ” λΆˆκ°€λŠ₯μ΄μ˜€λ‹€..
κ·Έλž˜μ„œ λ³΄λ‹ˆ 합을 λˆ„μ ν•΄μ„œ ꡬ해주고 합끼리 λΉΌμ£Όλ©΄ μ‹œκ°„λ³΅μž‘λ„κ°€ O(N) 인 것이닀.
κ·Έλž˜μ„œ μž…λ ₯ 받을 λ•Œ sum 배열을 ν•˜λ‚˜ 더 ν•΄μ„œ 계속 합을 μ €μž₯ν–ˆλ‹€.
그러고 ꡬ해야 ν•˜λŠ” λκ°’μ˜ ν•©μ—μ„œ (μ‹œμž‘ κ°’ -1) 합을 λΉΌμ£Όμ—ˆλ‹€.
λ„ˆλ¬΄ λ§Œλ§Œν•˜κ²Œ λ΄€λ‹€κ°€ ν•œ λŒ€ μ–»μ–΄λ§žμ€ 문제 ^^