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
2003 : 수들의 합2 / 문제 소개
N개의 수로 된 수열이 있는데 수열의 i번째 수 부터 j번째 수까지의 합이 M이 되는 경우를 구하는 문제이다.
풀이 과정
두 포인터 알고리즘을 활용해 문제를 풀었다. 쉽지 않은 문제다.. 이 문제는 두 용액과 비슷한 난이도 같은데,,
초기 수열의 left, right index를 0으로 잡고
right를 증가시키면서 sum을 누적 합으로 계산했다.
이때 M을 만족한다면 count를 증가시키고 sum에서 list[left]를 빼며 left를 증가시킨 상태에서 위와 같은 과정을 반복해 문제를 풀었다.
코드 구현
import Foundation
func BOJ_2003()
{
let ns = readLine()!.split(separator:" ").map{Int(String($0))!}
let n = ns[0], standardSum = ns[1]
let list = readLine()!.split(separator:" ").map{Int(String($0))!}
var sum = 0 ,right = 0 ,cnt = 0
for left in 0..<n
{
while sum < standardSum && right < n
{
sum += list[right]
right += 1
}
if sum == standardSum
{
cnt += 1
}
sum -= list[left]
}
print(cnt)
}
BOJ_2003()
visit my github