연속된 자연수의 합

최준호·2021년 8월 13일
0

알고리즘 강의

목록 보기
23/79

설명

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

만약 N=15이면

7+8=15

4+5+6=15

1+2+3+4+5=15

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

코드

public class ContinueNatureNumber {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int input1 = in.nextInt();
        int solution = solution(input1);
        System.out.println(solution);
    }
    public static int solution(int m){
        int answer = 0;
        int sum = 0;
        int lt = 0;
        int n = m/2+1;
        int[] natureNumber = new int[n];
        for(int i=0; i<n; i++){
            natureNumber[i] = i+1;
        }
        for(int rt = 0; rt<n; rt++){
            sum+=natureNumber[rt];
            if(sum == m) answer++;
            while(sum>=m){
                sum-=natureNumber[lt++];
                if(sum==m) answer++;
            }
        }
        return answer;
    }
}

저번 문제와 비슷한 문제다. 저번 문제에서는 배열을 입력받아 정해진 배열 내에서 검색했다면 이번에는 자연수의 배열을 내가 직접 만들어줘야한다. 근데 여기서 수학적 접근법으로 2개 이상의 자연수의 합인데. 예를 들어 예제에 나와 있는 15의 경우 자연수 1~15에서 두개 이상의 자연수의 합이라는 조건을 맞추기 위해서는 7,8이 넘어가는 숫자에서부터 의미가 사라진다 연속된 자연수의 합인데 8,9의 경우 이미 15를 넘기고 그 이상의 숫자들은 더 말할 의미가 없기 때문이다. 그래서 코드를 살펴보면 natureNumber의 배열의 크기는 우리가 기준으로 지정한 값 m에서 /2를 한 수에 +1을 한 크기만큼 자연수의 배열을 만들도록 설정해두었다. 물론 그렇게 하지 않아도 문제를 풀수 있겠지만 조금이라도 효율적인 코드를 위해서는 이런 수학적인 상식도 알고 있으면 도움이 되는 것 같다... 수학 좀 열심히 할걸

그 이외에는 저번 문제와 동일하니 설명은 더 필요 없을 것 같다.

연속된 자연수의 2개 이상의 합이라는 점을 확실하게 알고 푼다면 어렵지 않다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글