코딩테스트

[백준][Python] 2003 수들의 합 2

yeeejji 2024. 3. 17. 21:43
728x90

브루트포스, 투포인터 / 실버 4

🔢

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, M = map(int, input().split())
num = list(map(int, input().split()))
s = e = 0
ans = 0

while s <= e < N:
    if M == sum(num[s:e+1]):
        ans += 1
        s += 1
        if s > e:
            e += 1
    elif M > sum(num[s:e+1]):
        e += 1
    else:
        s += 1
        if s > e:
            e += 1

print(ans)

 

 

코드 설명

 

s: 시작 인덱스

e: 끝 인덱스

 

1. 수열의 합이 M인 경우

정답 변수를 증가시킨 후, s를 증가시킨다.

그런데, 만약 s가 e보다 커졌다면, e도 함께 증가시켜야 한다.

 

Ex)

N = 4, M = 5

num = [ 5, 1, 1, 1 ]

 

위와 같은 경우 s = 0, e = 0 일 때, 수열의 합(sum(num[0]))과 M이 일치하게 된다.

이 상황에서 s만 증가시키면 s = 1, e = 0이 되어 반복문을 종료하며, 뒤에 있는 숫자들은 검사할 수 없게 된다.

 

2. 수열의 합이 M보다 작은 경우

e를 증가시킨다.

 

3. 수열의 합이 M보다 큰 경우

s를 증가시킨다.

마찬가지로, s가 e보다 커졌다면, e도 함께 증가시켜야 한다.

while s <= e < N:
    if M == sum(num[s:e+1]):
        ans += 1
        s += 1
        if s > e:
            e += 1
    elif M > sum(num[s:e+1]):
        e += 1
    else:
        s += 1
        if s > e:
            e += 1

 

 

인덱스를 설정해주는 과정이 조금 헷갈렸다.