알고리즘/백준

[백준] 2018 -자바

삼록이 2025. 7. 17. 13:24

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

 

투포인터를 사용해야하는 문제다.


public class Main {
    public static void main(String[] args) throws IOException {
        /*
        1.자연수 n을 받는다.
        2.1부터 n까지 늘어놓는다 생각하고 포인터 2개를 1에 세팅한다
        3.두 포인터가 가르키는 수들의 합을 담는 변수 x를 둔다. 이 변수는 포인터 2개가 가르치는 범위의 합을 담으면 된다. 초기값으로는 1로 둔다.(포인터 2개가 1을 가르키고 있으니까)
        4.합을 담는 변수가 n과 같으면 가지수 +1 이되고. 엔트포인터를 +1이동. 엔드포인트를 +1이동했다는 것은 새로운 엔드포인트갑을 더해줘야한다.
          합을 담는 변수가 n보다 크면 시작포인트를 +1이동. 시작포인트 +1이동했다는 것은 기존에 시작포인트가 가르키는 값이 빠졌다는 것 그 값을 sum에서 먼저 빼줘야한다.
          합을 담는 변수가 n보다 작으면 엔드포인터+1이동. 엔드포인트를 +1이동했다는 것은 새로운 엔드포인트갑을 더해줘야한다.
         */

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int startPointer = 1;
        int endPointer = 1;
        int sum =1;
        int answer =0;

        while(endPointer<=n){
            if(sum == n){
                answer++;
                endPointer++;
                sum+=endPointer;
            } else if(sum>n){
                sum -=startPointer;
                startPointer++;
            } else{ //sum<n일 경우
                endPointer++;
                sum+=endPointer;
            }
        }
        System.out.println(answer);
    }
}

 


예전에는 이렇게 푼 기록이 있다.

문제는 어차피 1부터 n까지의 자연수로 한정해 굳이 배열로 안받았었도 되는데 배열로 받아서 풀이했다.

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[n+1];
        for(int i=1; i<n+1; i++){
            arr[i] =i;
        }

        int start = 1;
        int end = 1;
        int total = arr[1];
        int count =0;

        while(start<=end && end<arr.length){
            if(total == n ){
                total-=arr[start];
                start++;
                count++;
            } else if(total<n){
                end++;
                total+=arr[end];
            } else{
                total-=arr[start];
                start++;
            }
        }
        System.out.println(count);


    }
}