숫자의 표현(level2)

원용현·2022년 9월 11일
0

프로그래머스

목록 보기
14/49

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12924

문제

자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 반환하라.

예제로 이해

예를 들어 15의 경우 4가지의 방법으로 나타내는것이 가능하다.

1 + 2 + 3 + 4 + 5 = 15
4 + 5 + 6 = 15
7 + 8 = 15
15 = 15

위와 같이 어떠한 수가 주어질 때 연속된 자연수로 나타내야하는데 우선 가장 먼저 생각할 것이 n = 1인 경우이다. n = 1일 경우에는 무조건 1이 반환 되도록 코드를 작성한다.

다음으로 생각할 것은 주어진 n의 절반에서 올림을 진행한 숫자까지만 연속되는 자연수로 사용될 수 있다. 예를 들어 15의 경우 절반의 올림이 8인데 그 보다 큰 수인 9는 우리가 작성하는 자연수들의 연속에는 사용이 될 수가 없다.

위의 2가지를 생각하며 문제를 풀기위한 알고리즘을 구현한다.

코드

function solution(n) {
    let result = 1;
    let sum = 0
    let divide = Math.ceil(n / 2)
    let temp = divide
    
    if(n === 1) {
        return result
    }
    
    while(temp !== 0) {
        sum += temp
        temp--

        if(sum === n) {
            result++
            divide--
            sum = 0
            temp = divide
        } else if(sum > n) {
            divide--
            sum = 0
            temp = divide
        }
    }
    
    return result;
}

코드 풀이

먼저 선언할 것을 선언한 뒤에 n = 1일 경우에 무조건 1이 반환되도록 한다.

그 후에는 반복문을 진행하는데, 반복문의 조건에는 우리가 연속하는 자연수의 합이 n과 같도록 하는 것이 목적이므로 자연수의 영역을 벗어나기 전까지는 모두 확인을 하도록 한다. 즉, 자연수가 아닌 정수가 나오는 0에서 반복문을 끝내도록 한다.

알고리즘 자체는 주어진 n의 절반의 올림에서부터 1씩 줄여나가며 해당 자연수부터 그 아래의 자연수들의 합이 n과 같거나 커지는 경우에 대해 조건문이 작동하도록 구성하였다. 합이 n과 같으면 n을 반복되는 자연수의 합으로 나타내는 것이 가능하므로 반환할 값에 +1을 진행하고 자연수의 연속의 기준에 사용되는 값이 -1을 진행한다. 그리고 합계를 0으로 만든 뒤 해당 숫자부터 다시 1씩 줄여나가며 자연수의 합들을 계산한다.

합계가 n 보다 크면 연속되는 자연수의 합으로 나타낼 수 없다는 것이 되므로 위와 같은 과정에서 반환 값에 +1을 하는 과정만 빼고 진행한다.

내가 구성한 알고리즘은 while문을 사용해서 반복문이 진행되도록 하였지만 그 안의 내용을 분석해보면 이중 for문과 같은 프로그램의 진행을 보이기 때문에 이중 for문으로도 충분히 코드를 작성할 수 있다.

0개의 댓글