728x90
🔢
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
인덱스를 설정해주는 과정이 조금 헷갈렸다.
'코딩테스트' 카테고리의 다른 글
[백준][Python] 2847 게임을 만든 동준이 (0) | 2024.03.19 |
---|---|
[백준][Python] 22352 항체 인식 (0) | 2024.03.18 |
[백준][Python] 13265 색칠하기 (2) | 2024.03.17 |
[백준][Python] 1245 농장 관리 (0) | 2024.03.15 |
[백준][Python] 2660 회장뽑기 (0) | 2024.03.14 |