반응형
[Silver IV] 수들의 합 2 - 2003
성능 요약
메모리: 30840 KB, 시간: 584 ms
분류
두 포인터(two_pointer)
문제 설명
N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
출력
첫째 줄에 경우의 수를 출력한다.
N, M = map(int,input().split())
array = list(map(int,input().split()))
left,right = 0,1
cnt = 0
while right <= N and left <= right:
sum_array = array[left:right]
answer = sum(sum_array)
if answer == M:
cnt += 1
right += 1
elif answer < M:
right += 1
else:
left += 1
print(cnt)
left번째 숫자부터 right번째 숫자까지. 투 포인터로 해결할 수 있는 문제.
1.left~right번째 숫자의 합이 같거나 작으면 right번째 숫자를 계속 1씩 늘려준다.
2.작아지면 left번째 숫자를 1씩 늘려준다.
3.총 같았던 횟수 cnt 출력
'알고리즘' 카테고리의 다른 글
[Silver III] 숫자 야구 - 2503(구현, 순열) (1) | 2022.09.11 |
---|---|
[Silver III] 달팽이 - 1913 (구현) (1) | 2022.09.10 |
[Silver III] 사탕 게임 - 3085 (구현, 브루트포스) (1) | 2022.09.09 |
[Silver V] 올림픽 - 8979 (구현, 정렬) (1) | 2022.09.08 |
[Silver V] 다각형의 대각선 - 3049 (수학) (1) | 2022.09.06 |