[BOJ]1806. 부분합

2024. 9. 9. 18:06[Algorithm]/문제 풀이

문제

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

 

 

사용 알고리즘

투 포인터, 누적 합

 

풀이

고려사항

1. 시간 제한이 까다로운 문제

 

후기

1. Brute Force

가능한 부분 수열 모두를 탐색하는 방식으로 접근했다.

시간 복잡도는 O(N2)이다.

이때, N의 범위가 10 ≤ N < 100,000 으로 시간초과가 발생했다.

N이 매우 클 때 시간 초과가 발생할 수 있는 코드이다.

## 시간 초과 코드 - Brute Force ##

import sys

input = sys.stdin.readline


def find(num_list):
    for l in range(1, len(num_list) + 1):
        for i in range(len(num_list) - l):
            if sum(num_list[i : i + l]) == S:
                return l
    return 0


N, S = map(int, input().split())

num_list = list(map(int, input().split()))
print(find(num_list))

 

2. 투 포인터 (Two Pointer) 방식

위의 방식이 시간 초과가 발생하였기 때문에 시간적 효율을 높이기 위해 투 포인터를 채택했다.

투 포인터를 사용하면 한 번의 진행으로 문제 해결이 가능하고 시간 복잡도는 O(N)이다.

이 커도 투 포인터로 배열을 한 번만 스캔하기 때문에 시간적 측면에서 효율적이다.

 

코드

## 투 포인터 코드 ##

import sys

input = sys.stdin.readline

N, S = map(int, input().split())
num_list = list(map(int, input().split()))

left, right = 0, 0
sum = 0
min_length = 1e9

while True:
    if sum >= S:
        min_length = min(min_length, right - left)
        sum -= num_list[left]
        left += 1
    elif right == N:
        break
    else:
        sum += num_list[right]
        right += 1

if min_length == 1e9:
    print(0)
else:
    print(min_length)

 

결과

 

'[Algorithm] > 문제 풀이' 카테고리의 다른 글

[BOJ]1600. 말이 되고픈 원숭이  (2) 2024.10.10
[BOJ]9935. 문자열 폭발  (2) 2024.09.23
[BOJ]5636. 소수 부분 문자열  (0) 2024.09.09
[BOJ]17144. 미세먼지 안녕!  (2) 2024.08.28
[BOJ]9465. 스티커  (9) 2024.08.28