[BOJ] 백준 2003. 수들의 합 2

2024. 3. 20. 10:23· Java/BOJ

문제

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

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net


풀이

 문제의 조건에서 N의 input size가 최대 10,000 입니다. 만약 배열을 두 번 돌게 된다면 시간 복잡도 O(N^2)는 1억으로 1초가 넘어가 문제의 시간 제한 조건인 0.5초를 넘어가게 됩니다.

 

 그래서 이 문제는 투 포인터를 통해 접근해야 합니다.

 

 

매커니즘의 순서는 다음과 같습니다.

 

1. 만약 sum이 M과 같다면, cnt를 증가시키고, right의 값을 증가시킵니다.

2. sum이 M보다 작다면, right를 증가시켜 부분 수열의 범위를 늘립니다.

3. sum이 M보다 크다면, left를 증가시켜 부분 수열의 범위를 줄입니다.

 

1. 초기 상태

nums: [1, 1, 1, 1] 

sum: 0 cnt: 0

 

2. right를 이동하면서 sum에 숫자를 더함.

nums: [1, 1, 1, 1]
  left ^ right
   
sum: 1 cnt: 0

 

3. 더해간 결과, sum이 M과 같아지면 cnt를 증가시키고 right를 한 칸 이동

nums: [1, 1, 1, 1]
  left ^  ^ right
               
sum: 2 cnt: 1

 

4. 이제 sum이 M보다 크므로 left를 증가. 이를 위해 left를 한 칸 이동하고 sum에서 해당 값을 빼준다.

nums: [1, 1, 1, 1]
     left ^ right
          
sum: 1 cnt: 1

 

left가 N보다 작거나 같고 right가 N보다 작거나 같은 동안 위 과정을 반복합니다.

 

 

 

매우 유사한 문제로 백준 1806. 부분 합 문제가 있습니다. 조금의 응용만 하면 되니 함께 풀어보시는 걸 추천합니다. (관련 포스팅)


소스 코드

import java.util.Scanner;

public class B2003_수들의합2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        int[] nums = new int[N+1];
        for(int i = 0; i<N;i++){
            nums[i] = sc.nextInt();
        }
        int left = 0;
        int right = 0;
        int sum = 0;
        int cnt = 0;

        while(left<=N&&right<=N){
            if(sum==M) {
                cnt++;
                sum += nums[right++];
            }
            if(sum<M) sum += nums[right++];
            if(sum>M) sum -= nums[left++];
        }
        System.out.println(cnt);
    }
}

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 4386. 별자리 만들기  (0) 2024.03.25
[BOJ] 백준 19949. 영재의 시험  (0) 2024.03.21
[BOJ] 백준 14284. 간선 이어가기2  (2) 2024.03.19
[BOJ] 백준 1806. 부분 합  (0) 2024.03.19
[BOJ] 백준 19951. 태상이의 훈련소 생활  (0) 2024.02.27
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 4386. 별자리 만들기
  • [BOJ] 백준 19949. 영재의 시험
  • [BOJ] 백준 14284. 간선 이어가기2
  • [BOJ] 백준 1806. 부분 합
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 이석복
  • 네트워크
  • BOJ
  • 자바스크립트
  • 스택
  • OS
  • 구현
  • 자바
  • JCF
  • 반효경
  • 백준
  • Java
  • 프로그래머스
  • 인프런
  • 김영한
  • 큐
  • 한양대
  • 레디스
  • 운영체제

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 2003. 수들의 합 2
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.