코딩테스트/알고리즘 문제

[백준] 2003 수들의 합- Java

glorypang 2025. 4. 9. 23:11
728x90
반응형
SMALL

📌 문제 정보

  • 출처: 문제 링크
  • 난이도: ⭐
  • 문제 유형: 완전 탐색
  • 사용 언어: Java 

🔍 문제 설명

N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.


💡 풀이 노트

완전 탐색 

  • 모든 구간의 합을 일일히 계산해야 함
  • 시간복잡도 O(N²)

🚀 코드 (Java)

import java.io.*;

public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);

        input = br.readLine().split(" ");
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(input[i]);
        }

        int cnt = 0;
        // 완전 탐색: 모든 구간 [i, j]에 대해 합을 계산
        for (int i = 0; i < N; i++) {
            int sum = 0;
            for (int j = i; j < N; j++) {
                sum += arr[j];
                if (sum == M) {
                    cnt++;
                    break; 
                }
            }
        }
        System.out.println(cnt);
    }
}

🖥 실행 결과

입력
4 2
1 1 1 1

 

출력
3

입력
10 5
1 2 3 4 2 5 3 1 1 2

 

출력
3

🔄 개선 가능성

투 포인터

  • 한 번씩만 탐색 → 효율적
  • 시간 복잡도 O(N)
import java.io.*;

public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);

        input = br.readLine().split(" ");
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(input[i]);
        }

        int cnt = 0;

        int start = 0, end = 0, sum = 0;
        while (true) {
            if (sum < M) {
                if (end == N) break;
                sum += arr[end++];
            } else {
                if (sum == M) cnt++;
                sum -= arr[start++];
            }
        }
        System.out.println(cnt);
    }
}
while (true) {
    if (sum < M) {
        if (end == N)
       		break;
        sum += arr[end++];
    }
    else {
    	if (sum == M)
    		cnt++;
    	sum -= arr[start++];
    }
}
  • 구간의 합이 `M`보다 작다면 `end` 값을 늘려서 구간을 오른쪽으로 확장
    • 만약 `end`가 `N`까지 도달했다면 더 이상 확장 불가능 → 반복 종료
  • 합이 `M` 이상이라면:
    • 같다면 `cnt`를 증가시킴
    • 크다면 구간을 줄이기 위해 `start`를 오른쪽으로 이동

📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest

 

 

 

728x90
반응형
LIST