https://www.acmicpc.net/problem/2003
문제분석
대표적인 투포인터 알고리즘 문제이다. 리스트를 탐색하면서 탐색한 리스트의 합이 m이면 카운트를 하여서 경우의 수를 출력하면 되는 문제이다. 수열의 개수와 나와야 하는 합을 첫째 줄에 입력받고 다음 줄에 해당 수열을 입력받는다.
코드
n, m = map(int, input().split())
s = list(map(int, input().split()))
ans = 0
l = 0
r = 0
while(r<n):
k = sum(s[l:r+1])
if k == m:
ans += 1
r += 1
elif k > m:
l += 1
else:
r += 1
print(ans)
문제풀이
왼쪽 포인터, 오른쪽 포인터를 각각 지정한다. 이를 통해 while loop를 탐색하면서 리스트 내의 합을 구하면 된다. 조건문을 통해 리스트 l부터 r까지의 합이 m과 같을 경우는 카운트 하고 right 포인터에 +1을 하여 합의 크기를 늘린다. 합이 m보다 클 경우는 left 포인터에 +1을 하여 합의 크기를 줄인다. 합과 m이 같은 경우에는 카운트를 해주고 right 포인터에 +1을 하여 탐색을 계속한다. 마지막에 카운트한 변수 ans를 출력하면 된다.
'Koala - 6기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/C++] 2110번 공유기 설치 (0) | 2022.03.30 |
---|---|
[BOJ/python] 14503번 로봇 청소기 (0) | 2022.03.27 |
[백준/C++] 2230번 수 고르기 (0) | 2022.03.21 |
[BOJ / Python] 16395: 파스칼의 삼각형 (0) | 2022.03.20 |
[BOJ/python] 1463번 1로 만들기 (0) | 2022.03.20 |