백준

[백준][Kotlin] 2018번 수들의 합5

끝까지 처음처럼 2023. 2. 26. 01:19
728x90

해당 문제는 투 포인터의 사용과 합계의 개념을 응용하여 작성 할 수 있는 문제였습니다.

 

해당 문제의 설명을 보시면 예를 들어, 15를 나타내는 방법은 15, 7+8, 4+5+6, 1+2+3+4+5의 4가지가 있다. 반면에 10을 나타내는 방법은 10, 1+2+3+4의 2가지가 있다. 라고 설명해 주고 있습니다.

 

만약 합계 값이 구하려는 값보다 클 경우는 작은 값을 가르키고 있는 인덱스값을 합계값에서 증가시키고, 이전에 가르키고 있던 값을 기존 합계값에서 빼주면 됩니다 

ex) 1+2+3 = 6 구하려는 값 5 이라면 2+3 = 5 

반대의 경우에는 큰 값을 가르키고 있는 인덱스를 증가 시킨 후 합계값에 더해 주면 됩니다.

ex) 3+4+5 = 12 구하려는 값 18 이라면 3+4+5+6 = 18 

 

하기는 작성한 코드와 제출 결과 입니다.

 

import java.util.StringTokenizer

fun main() {
    var st = StringTokenizer(readln())
    val N = st.nextToken().toInt()
    var idx1 = 1
    var idx2 = 2
    var answer = 1
    var sum = idx1 + idx2
//    val s = System.currentTimeMillis()
    while(idx2 <= (N+1)/2 ){
        if(sum == N){
            answer++
            idx2++
            sum += idx2
        } else if(sum > N){
            sum -= idx1
            idx1++
        } else {
            idx2++
            sum += idx2
        }
    }
//    val e = System.currentTimeMillis()
    println(answer)
//    println((e-s)/1000.0)
}