본문 바로가기
알고리즘 풀이

[알고리즘] 프로그래머스 | 숫자의 표현

by 째깍단 2023. 8. 24.

숫자의 표현

답: 

더보기
def solution(n):
    count = 1 
    for number in range(1, n // 2 + 2):
        result = 0
        for num in range(number, n):
            result += num
            if result == n:
                count += 1
                break
            elif result > n:
                break
    return count

 

 

문제 분석 및 해석

자연수 n이 주어질 때, 연속하는 수를 더해 n이 나오는 가짓수 구하기

 

ex) n = 15

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

 

>> 풀이생각

일단 자기 자신 count + 1

 

 

1 ~ n-1까지.. 1로 시작해 2~ 차례로 더하도록 하기  : for문?

 

1부터 배열? 혹은 range 에서 차례로 더하여  : while

더한 수가 == n 혹은 % n == 0를 완전히 충족하는경우 count + 1

 

예제를 보니 보아하니 1 ~ n-1 까지 안해도 되고 n // 2 + 1 까지만 해보면 될듯

range니까 +1

 

 

 

 

풀이

count = 1로 자연수 n 자기자신을 미리 포함해 시작

 

첫 for문은 시작해야하는 숫자를 나타내는 number

첫 for문에 두번째 for문에서 초기화된 0으로 값을 시작해야하는 result를 선언

두번째 for문의 range에 number, n을 넣어 해당 숫자를 result에 순서대로 +하여 저장할 수 있도록 하기

 

    for number in range(1, n // 2 + 2):
        result = 0
        for num in range(number, n):
            result += num

 

result가 n이랑 동일한 경우 count +1 해주고 for문 탈출

result가 더하다가 n보다 커지면 for문 탈출

 

 

 

 

리뷰.

이중 for 문 혹은 for while을 이용해야겠다는 생각이 들었다.

result가 초기화 되는 부분과 range의 범위는 잘 잡았는데,

이후 식을 쓰는데 시간이 필요했다.

 

어제 문제가 생각을 가볍게 해야했다면 오늘 문제는 좀더 깊이 생각해봐야하는 문제였다.

 

 

 

 

등차수열 합 공식을 활용할 수도 있다고 한다.

 

더보기
# 문제 개편 전 풀이이므로 올바른 답이 나오지 않을 가능성이 있음 주의**
def expressions(num):
    return len([i  for i in range(1,num+1,2) if num % i is 0])

예를 들어 n이 3개의 연속된 자연수(i-1, i, i+1)의 합으로 표현된다면 합은 3i가 됩니다. 즉, n은 3의 배수입니다. 마찬가지로 5개의 연속된 자연수의 합으로 n이 표현이 된다면 n은 5의 배수여야합니다. 따라서, n의 약수 중 홀수가 몇개있냐는 문제와 같은 문제로 해석할 수 있습니다.