알고리즘/프로그래머스

프로그래머스 - 숫자의 표현 / Python

Hwisaek 2021. 10. 3. 01:04
반응형

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

 

코딩테스트 연습 - 숫자의 표현

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할

programmers.co.kr

문제 설명

더보기
문제 설명

Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 수 있습니다.

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

자연수 n이 매개변수로 주어질 때, 연속된 자연수들로 n을 표현하는 방법의 수를 return하는 solution를 완성해주세요.

제한사항

  • n은 10,000 이하의 자연수 입니다.

입출력 예

nresult
15 4

입출력 예 설명

입출력 예#1
문제의 예시와 같습니다.


 


정답

# https://programmers.co.kr/learn/courses/30/lessons/12924
def solution1(n):
    answer = 1
    for i in range(1, n // 2 + 1):
        sum = 0
        a = i
        while True:
            sum += a
            a += 1
            if sum > n:
                chk = False
                break
            elif sum == n:
                chk = True
                break
        if chk:
            answer += 1
    return answer


def solution(n):
    return len([i for i in range(1, n + 1, 2) if n % i is 0])


print(solution(15))  # 4
print(solution(1))  # 1
print(solution(2))  # 1

 

 


풀이

 1부터 n의 절반값까지 반복하면서 연속된 수의 합이 n이 되는 개수가 몇개인지 찾는 완전 탐색 문제입니다. n의 범위가 10000 이하로 작아서 이 방법을 이용하여 문제를 해결할 수 있습니다.

 

 라고 생각했으나 등차수열의 합 공식을 이용하여 간단히 해결하는 방법이 있었습니다.

 

a ~ b 까지의 합 = b(2a + b - 1) / 2 = n (a, b는 자연수)

 

 이 공식을 이용하면 문제를 해결할 수 있습니다. 위 공식의 조건은 a, b가 자연수라는 것인데 이를 a를 기준으로 정렬하면 다음과 같습니다

 

a = n / b -(b + 1) / 2

 여기서 a가 자연수가 되려면 b는 n의 약수이면서 홀수여야 합니다. 이를 리스트 컴프리헨션으로 나타내면 다음의 코드가 됩니다.

 

len([i for i in range(1, n + 1, 2) if n % i is 0])

 

 처음에는 수의 범위가 크지 않아 브루트 포스로 해결하려고 생각하고 더 빠른 방법을 찾으려 하지 않은 것이 창의적인 사고를 막은 게 아닌가 싶습니다.

반응형