철갑이의 이모저모

[백준] 2003번(수들의 합 2) with Python 본문

알고리즘

[백준] 2003번(수들의 합 2) with Python

철갑 2020. 10. 2. 20:46
728x90

문제

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

풀이

시간초과가 나서 투포인터를 공부해 문제를 풀어보았다.

합이 M보다 작은 경우 end 1 증가 시키고, M과 같으면 카운트, M보다 커지면 start 값을 1 증가시킨다. (반복) 

N, M = map(int, input().split(' '))
A = list(map(int, input().split(' ')))
cnt = 0
x = 0
end = 0

for start in range(N) :
    while x < M and end < N :
        x += A[end]
        end += 1
    if x == M :
        cnt += 1
    x -= A[start]

print(cnt)

 

N, M = map(int, input().split(' '))
A = list(map(int, input().split(' ')))
cnt = 0
j = 1

for i in range(N) :
  if A[i] == M :
    cnt += 1
  elif A[i] < M and j > i :
    x = A[i]
    for j in range(1,N) :
      x += A[j]
      if x == M :
        cnt += 1
  else :
    pass

print(cnt)

시간초과가 나왔던 코드

728x90