본문 바로가기

Algorithm/BOJ

[BOJ] 2003. 수들의 합2

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

 

1. 해결방법

"""
1. 아이디어
- 투 포인터를 활용
- 왼쪽 첫 번째 두 번째를 target으로 잡고 합을 계산
- 합이 M보다 작다면 두 번째 타겟의 위치를 +1, 반대면 첫 번째 타겟의 위치를 -1, 합이 M 이라면 count + 1
- 첫 번째 타겟이 N보다 같거나 커지면 종료

2. 시간 복잡도
- O(N)
"""

 

 

2. 정답코드

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
nums = list(map(int, input().split()))

left, right = 0, 1
count = 0
add_num = 0

while right <= N and left <= right:
    add_num = sum(nums[left:right])

    if add_num == M:
        count += 1
        right += 1
    elif add_num < M:
        right += 1
    else:
        left += 1

print(count)
바보 같이 while문에서 조건이 헷갈렸다. 두 개의 포인터를 사용해야하는데 종료 조건을 만족하지 못해서 계속 무한 루프에 빠진 문제였다...

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1920. 수 찾기  (0) 2022.09.03
[BOJ] 2467. 용액  (0) 2022.09.02
[BOJ] 3273. 두 수의 합  (0) 2022.09.01
[BOJ] 2559. 수열  (0) 2022.09.01
[BOJ] 14719. 빗물  (0) 2022.08.05