알고리즘

[프로그래머스] 숫자의 표현

여러가지이야기 2020. 7. 15. 01:27

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

  • 나는 합을 구하라고 하면.. 리스트에 어펜드해서 sum 하는 것이 일단 떠오른다.
  • 그런데 어펜드는 효율성 면에서 매우 좋지 않다.
  • 대안은 리스트에 원소를 넣어서 더해주려고 하지말고, 숫자를 바로 더해주면 된다
#append 쓸 경우
def solution(n):
    answer = 0
    start_num = 1
    while start_num <= n:
        numlist = []
        for i in range(start_num, n+1):
            numlist.append(i)
            # print(numlist)
            if sum(numlist) == n:
                answer += 1
                # print(answer, sum(numlist))
                break
            elif sum(numlist) > n:
                break
        start_num += 1
    return answer

  • 더 나은 풀이
#append 안쓰고 바로 더해주기
def solution(n):
    answer = 0
    start_num = 1
    while start_num <= n:
        num = 0
        for i in range(start_num, n//2 + 2):
            num += i   
            if num == n:
                answer += 1
                break
            elif num > n:
                break
        start_num += 1
    return answer + 1
  • 리스트를 만들지 않았고, num 변수를 설정하고 num에 i를 더해주면서 num == n 인지 확인했다
  • 그리고 for문을 돌 때 절반으로 자른 정수 값 보다 하나 큰 수를 포함하도록( 예: if n=15, 7 + 8 = 15) 해서 for문이 끝까지 돌지 않도록 하고, 대신 answer에 1을 더해줘서 자기 자신일 때를 셀 수 있도록 했다(예: 15 = 15, for문에서 i는 8을 포함하는 것 까지)

  • 더더 나은 풀이
def solution(n):
    answer = 0
    for i in range(1, n//2 + 1):
        a = 0
        while a <= n:
            a += i
            i += 1
            if a == n:
                answer += 1
                break
    return answer + 1
  • 여기는 while이 for문 안에 있고, a를 while 안에서 i를 더해 갱신시키고, 동시에 i값도 1씩 늘려준다

  • 효율성을 비교해보면 많이 짧아진 것을 볼 수 있다

도움 주신 분^_^

2번째 풀이: https://ninano1109.tistory.com/15

3번째 풀이: 이준현