[Python] 프로그래머스 - 숫자의 표현 (연습문제/Level 2)

yunyoung·2021년 3월 4일
0

알고리즘

목록 보기
30/41

문제 설명

📃 문제 링크

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
154

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

문제 풀이

완전탐색으로 풀었다.

2중 for문을 사용해서 1~n의 숫자부터 시작해 연속된 숫자를 sum에 더해준다. sumn이 되면 answer를 하나 올려 주고 두 번째 for문을 나가 다시 다음 숫자부터 시작한다. 이 때, 시간을 줄이기 위해서 sumn보다 커질 경우 더 이상 연속된 숫자를 더해줄 필요가 없기 때문에 두 번째 for문을 나가도록 구현했다.

소스 코드

다른 풀이

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

코드를 한 줄로 끝내고, 시간도 훨씬 빠른 코드가 있었다.
수학 공식을 구현한 코드이다.
n 이하인 숫자 a부터 k개의 연속된 숫자의 합이 n이라고 가정한다면

a + (a+1) + (a+2) + ... + (a+k-1) = k(2a+k-1)/2 = n
a <= n
k < n
a,k : 자연수

위의 식을 정리하면 a = n/k + (1-k)/2가 된다.
a가 자연수라는 조건이 성립하기 위해서는

n/k 가 자연수이려면 : k는 n의 약수여야 한다.
(1-k)/2 가 정수가 되려면 : 1-k 가 짝수여야 하므로 k는 홀수여야 한다.
k < n

위 조건을 만족해야 한다.

따라서 위의 조건을 만족하는 k의 개수만큼 연속된 자연수의 합이 n이 될 수 있기 때문에, n의 약수이면서 홀수인 k를 찾으면 된다.

📌 참고 링크

숫자의 표현

profile
🌈TIL과 개발 노트

0개의 댓글