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

 

[난이도] Silver3
[유형] 투 포인터

[풀이]
값들을 배열에 저장 후 sum과 left index를 의미하는 left 변수를 유지하면서
for문을 돌리면서 sum에 arr[i]를 더해준다.
더해준 뒤 sum이 m보다 크다면 arr[l]을 sum에서 빼주고 l을 1 증가시켜주기를 sum이 m보다 크지 않을때까지 반복한다.
위 과정을 끝낸 뒤 sum==m 이라면 ans에 1을 더해주고 다음으로 넘어간다.

 

import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
    var input = readLine().split(' ')
    var n = input[0].toInt()
    var m = input[1].toInt()
    var arr = readLine().split(' ').map{it.toInt()}
    var ans=0
    var sum=0
    var l=0
    for(i in 0..arr.size-1) {
        sum += arr[i]
        if (sum > m) {
            while (l < i && sum > m) sum -= arr[l++]
        }
        if(sum == m) ans++
    }
    println(ans)
}

 

 

https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Silver3/2003.cpp

+ Recent posts