수학을 공부하던 민지는 재미있는 사실을 발견하였습니다. 그 사실은 바로 연속된 자연수의 합으로 어떤 숫자를 표현하는 방법이 여러 가지라는 것입니다. 예를 들어, 15를 표현하는 방법은 (1+2+3+4+5), (4+5+6), (7+8), (15)로 총 4가지가 존재합니다. 숫자를 입력받아 연속된 수로 표현하는 방법을 반환하는 expressions 함수를 만들어 민지를 도와주세요. 예를 들어 15가 입력된다면 4를 반환해 주면 됩니다.

문제 보러가기


코드 및 풀이

숫자를 더했을 때 나오는 값을 더하는 값의 개수별로 생각해본 결과 다음과 같은 수열이 나온다.

  • 2개씩 더했을 때 3부터 2씩 증가하는 수열 : 1, 2, 3, 4, 5, ...

    일반화 수식 : 2n + 1

  • 3개씩 더했을 때 6부터 3씩 증가하는 수열 : 3, 5, 7, 9, 11, ...

    일반화 수식 : 3n + 3

  • 4개씩 더했을 때 10부터 4씩 증가하는 수열 : 6, 9, 12, 15, 18, 21, ...

    일반화 수식 : 4n + 6

  • 5개씩 더했을 때 15부터 5씩 증가하는 수열 : 15, 20, 25, 30, 35, 40, ...

    일반화 수식 : 5n + 10

… (계속됨)

위 수열의 수식들을 나열해보면 새로운 수열이 생성된다.

2n + 1, 3n + 3, 4n + 6, 5n + 10, …

이 수열을 일반화하는 식은 다음과 같다.

(m + 1) * n + (m**2 + m) / 2

위의 식을 사용하여 다음과 같이 풀었다.

def expressions(num):
    answer = 0
    m = 0
    
    # 1, 3, 6, 10, 15,... 로 증가하는 수열들의 첫번째 값들에서
    # num을 초과하는 값으로 시작하는 값은 걸러낸다.    
    while True:
    	 # boundary는 각 수열들의 시작값이다. 
        boundary = (m ** 2 + m) // 2
        # boundary가 num보다 큰 경우가 나올 때까지 반복문 실행
        if boundary > num:
            # boundary를 넘어서지 않는 범위 내에서 반복문을 돌며 
            for i in range(0, m - 1):
                # 첫 수열은 항상 값이 있으므로 최대범위를 num인자로 잡고
                for n in range(num + 1):
                    # 위에서 구한 식을 isnum 변수에 할당
                    isnum = (i + 1) * n + ((i ** 2 + i) // 2)
                    # 숫자가 일치하고 그 때 n 값이 정수형인 것이 있으면
                    if isnum == num and int(n):    
                        # 경우의 수인 answer에 1 추가
                        answer += 1
                        # answer 반환
            return answer
        m += 1


주석을 제거한 코드

"""
숫자의 표현
"""

def expressions(num):
    answer = 0
    m = 0
    
    while True:
        boundary = (m ** 2 + m) // 2
        if boundary > num:
            for i in range(m - 1):
                for n in range(num + 1):
                    isnum = (i + 1) * n + ((i ** 2 + i) // 2)
                    if isnum == num and int(n):    
                        answer += 1
            return answer  
        m += 1

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(expressions(1590));



Julia Hwang

디발자를 꿈꾸는 웹개발자의 블로그입니다.