코딩테스트

[투 포인터] 5. 연속된 자연수의 합

개발하는지호 2023. 12. 26. 22:37
5. 연속된 자연수의 합
 

설명

N입력으로 양의 정수 N이 입력되면 2개 이상의 연속된 자연수의 합으로 정수 N을 표현하는 방법의 가짓수를 출력하는 프로그램을 작성하세요.

만약 N=15이면

7+8=15

4+5+6=15

1+2+3+4+5=15

와 같이 총 3가지의 경우가 존재한다.

입력

첫 번째 줄에 양의 정수 N(7<=N<1000)이 주어집니다.

출력

첫 줄에 총 경우수를 출력합니다.

예시 입력 1 

15

예시 출력 1

3

 

 

<<풀이>>

 

시간 복잡도 : O(N)

풀이 방법 : 투포인터, 슬라이딩 윈도우

 

우선 나는 투포인터와 슬라이딩 윈도우를 복합적으로 이용하여 구했다.

사실, 이전 강의의 코드와 크게 차이가 없어서 금방했다.

강사님의 또 다른 풀이가 있을 거 같아 기대가 된다 ㅋㅋ

import java.util.*;

class Main {

    public int solution(int n) {
        int lt = 1, sum = 0;
        int answer = 0;
        for(int rt = 1; rt < n; rt++) {
            sum += rt;
            while (sum >= n) {
                if (sum == n) {
                    answer++;
                    sum -= lt++;
                } else if(sum > n) sum -= lt++;
            }
        }

        return answer;

    }



    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.print(T.solution(n));
    }
}

 

-강사님 풀이-

 

강사님 풀이는 두 가지가 있었는데, 하나는 나와 같았다 !! ㅎㅎ

 

근데 또 다른 방식은 완전히 수학적으로 접근한 방식인데 신박했다 ㅋㅋ..

 

이 강사님의 매력은 미쳤다 ..

 

import java.util.*;

class Main {

    public int solution(int n) {
        int answer = 0, cnt = 1;
        n--;
        while(n > 0) {
            cnt++;
            n = n - cnt;
            if(n % cnt == 0) answer++;
        }

        return answer;

    }



    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.print(T.solution(n));
    }
}

 

ㅋㅋㅋㅋ 이 코드를 보면 이해를 하겠는가!!

 

그려서 설명해보겠다.

 

ㅋㅋㅋㅋ 신기하지 않나 ?? 연속된 값의 합이 구하고자 하는 값을 구할 때 미리 연속될 갯수를 정해두고 먼저 1 부터 n 까지 합한 것을 구하려는 값에 뺀 뒤에 연속될 갯수 만큼 나눠줬을 때 나머지가 0이 되면 연속된 자연수가 가능하게 되는 것이다. 신기하면서도 신박하다 정말..

 

오늘도 한 대 맞고 두 대 맞고 간다 ㅋㅋ ㅎㅎ