[Python] BOJ 2003 - 수들의 합 2

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

# 투 포인터 기초문제이다.

# left, right라는 포인터 두 개를 이용해 진행한다.

 

1. left를 0, right를 1로 초기 설정하고 num의 첫번째 값이 s이면

     ans를 1부터 시작하고 아니면 s는 0으로 시작한다.

 

2. while문 안에서 left와 right포인터가 모두 N이라면 둘 다 맨 오른쪽(맨 끝)까지 간 것이므로 break

   

  2-1. 만약 현재 s(포인터 사이의 수들의 합)가 M보다 작고 right가 N보다 작은경우 s에 right포인터가

         가리키는 값인 num[right]를 넣어주고 right를 1증가시킨다.

  2-2. 현재 s가 M보다 크거나 right가 N에 도달한 경우 s에서 num[left]값을 빼준 뒤, left를 1증가시킨다.

 

  2-3. 중간 중간 s가 우리가 찾고자하는 M값과 같아질 경우 ans를 1증가시킨다.

 

3. 최종적으로 ans 출력

 

import sys
input = sys.stdin.readline
N, M = map(int,input().split())
num = list(map(int,input().split()))
ans = 0
left, right = 0, 1
s = num[0]

if s == M:
    ans += 1
while True:
    if left == right == N:
        break
    
    if s < M and right < N:
        s += num[right]
        right += 1
    else:
        s -= num[left]
        left += 1

    if s == M:
        ans += 1
    
print(ans)

(solved.ac 티어: 실버 3)

 

# 전역하고 몇 주 놀았더니 감을 좀 잃은 것 같다.. 다시 열심히 PS하자!

728x90
반응형
TAGS.

Comments