algorithm

연속된 자연수의 합

juuuuuuun 2024. 5. 13. 13:01

설명

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

 

소스 코드 1

import java.util.Scanner;

public class Main {
    public static int solution(int N) {
        int ans = 0;
        //2개의 자연수를 뽑아 답을 구한다해도 홀수의 경우 (N/2)+(N/2+1) 의 경우가 최대이므로 N/2+1까지만 루프
        for (int i = 1; i <= N / 2 + 1; i++) {
            int sum = 0;

            //i부터 차례로 카운트해서 더하며 sum이 N을 넘지 않을 때 까지 반복
            //만약 sum==N을 충족 못 시키면 ans 카운트 없이 그냥 넘어간다
            for (int j = i; sum < N; j++) {
                sum += j;
                if (sum == N) {
                    ans++;
                }
            }
        }
        return ans;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        System.out.println(solution(N));

    }
}

 

소스 코드 2

import java.util.Scanner;
//연속된 자연수의 합 (투포인터)

public class Main {
    public static int solution(int N) {
        int ans = 0;
        int lt = 1; //left를 1로 둔다.
        int sum = 0;
        //2개의 자연수를 뽑아 답을 구한다해도 홀수의 경우 (N/2)+(N/2+1) 의 경우가 최대이므로 N/2+1까지만 루프
        for (int rt = 1; rt <= N / 2 + 1; rt++) {
            sum += rt; //루프 마다(rt가 증가할 때 마다) rt를 sum에 더해준다
            while (sum >= N) {
                if (sum == N) { //같을 경우는 ans를 카운트 해준다.
                    ans++;
                }
                //sum이 N보다 작아질 때 까지 left를 올려주며 sum에서 빼준다.
                sum -= lt;
                lt++;
            }
        }
        return ans;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        System.out.println(solution(N));

    }
}

 

소스 코드 3

import java.util.Scanner;
//연속된 자연수의 합 (수학)

public class Main {

    //2개의 숫자로 15를 만드는 경우의 수
    //먼저 1부터 차례로 두개를 뽑고 15에서 합을 뺀다 -> 15-(1+2) =12
    //이 값이 뽑은 숫자의 개수(2개)로 나눴을 때 나머지가 0이라면 정답 -> 12%2=0
    //왜 그렇게 되냐면 1과 2에 12/2값인 6을 하나씩 할당해주면 7과 8이 되어서 두 수의 합이 15가 된다.
    public static int solution(int N) { //if 15
        int ans = 0;
        N--; //1 뽑고 N에서 빼주기
        int cnt = 1; //연속된 자연수 개수 (현재 1)
        while (N > 0) {
            cnt++; //그 다음 수를 뽑고 (뽑은 개수와 수의 값은 일치)
            N -= cnt; //그 수를 N에서 빼준다
            if (N % cnt == 0) { //만약 N에서 cnt를 나눴을 때 나머지가 0이라면 (1~cnt 까지 모두 같은 값을 할당해줄 수 있다면) 
                ans++;//정답이므로 ans 카운트
            }
        }

        return ans;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        System.out.println(solution(N));

    }
}

'algorithm' 카테고리의 다른 글

학급 회장 / HashMap 정리  (0) 2024.05.13
최대 길이 연속부분수열  (0) 2024.05.13
연속 부분수열  (0) 2024.05.11
최대 매출  (0) 2024.05.11
공통원소 구하기  (0) 2024.05.09