Algorithm/문제 풀이

연속된 자연수의 합

ilyadelavie 2022. 5. 20. 14:16

문제


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

만약 N=15이면

7+8=15

4+5+6=15

1+2+3+4+5=15

 

입력

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

출력 

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

 

Key Point


  • 연속된 자연수 합이 n이 되려면 자연수의 가장 큰 값 max는 최대 n/2+1이 된다.
  • two pointer 알고리즘 사용 

 

코드

내 풀이

import java.util.Scanner;

public class Main {
    public int solution(int n){
        int max = n/2+1;
        int sum =0;
        int [] arr = new int[max];
        int s=0;
        int count = 0;
        for(int i=0;i<max;i++){
            arr[i] = i+1;
        }
        for(int e=0; e<max;e++){
            sum+=arr[e];
            if (sum==n) count++;
            while (sum>=n){
                sum-=arr[s++];
                if(sum==n) count++;
            }
        }
        return count;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.println(T.solution(n));
    }
}

 

이건 왜 안될까?

더보기
import java.util.Scanner;

public class Main {
    public int solution(int n){
        int max = n/2+1;
        int [] arr = new int[max];
        int s=0;
        int e=arr.length-1;
        int count = 0;
        for(int i=0;i<max;i++){
            arr[i] = i+1;
        }
        while(s<e){
            int sum = arr[s]+arr[e];
            if(sum<=n)
                s++;
            else if(sum>n)
                e--;
            if(sum==n)
                count++;
        }
        return count;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.println(T.solution(n));
    }
}