[백준 - 11659/ Java] 구간합 구하기

2024. 3. 12. 22:18·문제 풀이/백준 문제풀이
728x90
반응형
SMALL

문제를 풀기 전에 우선 구간합을 구하는 방법을 알아야한다.

하지만 또! 구간합을 구하기 전에 합 배열을 만들줄 알아야 한다. ㅎㅎ

알아야하는 이유는 다음과 같다.

반복문으로 해당 문제를 풀었을때에는 시간 초과가 발생했다.

  •  주어진 질의의 개수가 최대 10만개이다.
  • 수의 개수도 최대 10만개이다.
  • 최악의 경우에는 10만개의 수를 가진 배열안에서 10만번의 질의를 반복문을 돌려야한다. 이때 반복문을 통한 시간복잡도 O(n^2)로는 해결할 수 없다.
  • 이 때 구간합으로 문제를 해결한다면 누적배열합을 생성하는데 O(N)이 들고 M번 반복하므로 O(N+M)의 시간복잡도를 갖는다.
  • 해당 문제는 1초안에 풀어야하는데 구간합 알고리즘을 모른다면 반복문으로 통해 최악의경우 1억회이상의 연산을 하기때문에 시간내에 풀기 힘들것이다.

 

합 배열이란?

예를 들어 5개를 넣을 수 있는 배열이 있다. 이 배열을 합 배열로 만든다고 하면 아래처럼 만들수있다.

A배열은 배열에 값을 순서대로 넣은 것

S배열은 인덱스가 지남에 따라 이전 인덱스에 있는 값들을 합산한것이다.

공식으로 한다면 이와 같다.

S[i] = S[i-1] + A[i]

S[i-1] = 이전 인덱스들의 합

A[i] = 현재 인덱스의 값

 

 

이러한 합 배열을 만들었다면 구간합을 만들어 볼 수 있다.

구간합의 공식은 다음과 같다.

intervalSum = s[end] - s[start-1]

그림으로 나타내면 이와 같다.

원하는 구간의 합을 구하기 위해서는 해당 요구 구간의 마지막에서 해당 요구 구간 첫영역의 이전 영역을 빼는것이다.

예를 들어, 값이 인덱스마다 1개씩 증가하는 배열이 있다. [0,1,2,3,4,5] 

이 배열을 합 배열로 만든다면 이렇게 나온다. [0,1,3,6,10,15]

1~4번째 구간의 합을 구하고 싶다면  4번째 값에서 0번째값을 뺀다. 10-0 =10이다. (0+1+2+3+4 =10 )

2~3번째 구간의 합을 구하고 싶다면 3번째 값에서 1번째 값을 뺀다. 6-1= 5다. (2+3=5)

이러한 알고리즘을 적용하여 코드를 구현하면 다음과 같다.

 

package Array;

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

public class ArrayP11659 {
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int suNo = Integer.parseInt(st.nextToken());
        int quizNo = Integer.parseInt(st.nextToken());
        //덧셈이나 곱셈이 많을때는 습관적으로 long[]만들어주는게 좋다.
        long[] S = new long[suNo+1];

        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <=suNo; i++) {
            S[i] = S[i-1] + Integer.parseInt(st.nextToken());
        }

        for (int i = 0; i < quizNo; i++) {
        st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            System.out.println(S[end]-S[start-1]);
        }
    }
}

 

728x90
반응형
SMALL

'문제 풀이 > 백준 문제풀이' 카테고리의 다른 글

[백준 - 1715/ java] 카드정렬하기 - 우선순위 큐  (0) 2024.03.18
[백준 2164-Java ] 카드2 + Queue에 대한 설명  (0) 2024.03.17
[백준 - 2178/ 자바(Java)] 미로 탐색 문제 BFS로 해결하기  (1) 2024.02.28
[백준 -24480 ] java , 알고리즘 수업 - 깊이 우선 탐색 2  (2) 2024.02.26
[백준 11724 - 연결 요소의 개수] DFS를 활용한 문제 풀기  (0) 2024.02.24
'문제 풀이/백준 문제풀이' 카테고리의 다른 글
  • [백준 - 1715/ java] 카드정렬하기 - 우선순위 큐
  • [백준 2164-Java ] 카드2 + Queue에 대한 설명
  • [백준 - 2178/ 자바(Java)] 미로 탐색 문제 BFS로 해결하기
  • [백준 -24480 ] java , 알고리즘 수업 - 깊이 우선 탐색 2
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Til
      Spring Data Redis
      Spring
      java
      redis 채팅
      springsecurity
      JS
      레디스
      자바스크립트
      redis
      스프링프레임워크
      백준
      자바 알고리즘
      jsp request
      JSP
      JavaScript
      Springframework
      HTML
      리눅스
      자바 면접
      리눅스마스터2급
      자바
      자바기초
      자바 면접질문
      spring redis
      jsp기초
      리눅스마스터2급정리
      프로그래머스
      자바 반복문
      CSS
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [백준 - 11659/ Java] 구간합 구하기
    상단으로

    티스토리툴바