알고리즘

백준 1024번 수열의 합 (JAVA)

박카스마시며코딩 2023. 7. 31. 13:23

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

 

1024번: 수열의 합

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

www.acmicpc.net

 

저는 투포인트를 이용해 문제를 해결하였습니다.

투 포인트를 통해 두 숫자 사이의 합을 구하고 이 값이 n보다 작다면 뒤 포인트를 늘려 합을 늘리고, 크다면 앞 포인트를 늘려 합을 줄여 나가면서 n과 같아지는 순간을 찾고 그 중 제일 짧은 길이를 구하였습니다. 

만약 95%에서 틀렸습니다가 나온다면 

입력 1 2 -> 답 0 1 이 나오는지 확인해보시기 바랍니다.

 

package BOJ.twopoint;

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

public class BOJ_1024 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = stoi.apply(st.nextToken());
        int l = stoi.apply(st.nextToken());
        int startNum = 0;
        int endNum = 0;
        int sum = 0;
        int[] result = null;
        while(endNum <= n + 1){
            if(endNum - startNum > 100){
                sum -= startNum;
                startNum++;
                continue;
            }
            if(sum < n){
                sum += endNum;
                endNum++;
            }else if(sum == n){
                if(endNum - startNum >= l && result == null){
                    result = new int[]{startNum, endNum};
                }else if(endNum - startNum >= l && result[1] - result[0] > endNum - startNum){
                    result = new int[]{startNum,endNum};
                }
                sum -= startNum;
                startNum++;
            }else{
                sum -= startNum;
                startNum++;
            }
        }
        if(result == null){
            System.out.println(-1);
            return ;
        }
        for(int i = result[0] ; i < result[1] ; i++){
            System.out.print(i+" ");
        }
    }
}