알고리즘

백준 2018번 수들의 합 5 (JAVA)

박카스마시며코딩 2022. 4. 16. 16:25

https://www.acmicpc.net/problem/2018

 

2018번: 수들의 합 5

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한

www.acmicpc.net

저는 해당 문제를 투포인트 개념을 이용하여 문제를 해결하였습니다.

저는 시작 인덱스와 끝 인덱스를 가리키는 포인터 두개를 가지고 시작하였습니다.

처음에는 둘 다 0으로 시작합니다.

sum을 이용해 시작점과 끝점사이의 합을 구하였습니다.

sum이 입력값보다 작다면 끝점을 늘리고 이 값을 sum에 더해주고 같거나 크다면 시작점을 늘리고 이 값을 sum에 빼줌으로써 sum으로 시작점과 끝점사이의 합을 구하였고 sum가 입력값이 같다면 result를 늘려 결과값을 도출하였습니다.

시간복잡도 : O(n)

 

package BOJ.TwoPoint;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.function.Function;

public class BOJ_2018 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(br.readLine());
        int result = cal(n);
        System.out.println(result);
    }

    private static int cal(int number) {
        int result = 0;
        int startIndex = 0;
        int endIndex = 0;
        int sum = 0;
        while(endIndex <= number){
            if(sum < number){
                sum += ++endIndex;
                continue;
            }else if(sum == number){
                result++;
                sum -= ++startIndex;
            }else if(sum > number){
                sum -= ++startIndex;
            }
        }
        return result;
    }

}