프로그래머스 - 숫자의 표현(레벨2)

응애개발자·2023년 6월 12일
0

파이썬 코테

목록 보기
2/11
post-thumbnail

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

요약 설명:
자연수 n이 주어질 때, n이하의 연속된 자연수의 합이 n이 되는 경우가 몇개인지 세서 반환한다.

이게 첫번째로 짠 코드다.
나중에 보니 나도 무슨말인지 모르겠다.

def solution(n):

    answer = 0
    counter = 0
    s = 1

    while True:
        sum = 0
        counter = 0
        for i in range(s, n + 1):
            sum += i

            if sum < n:
                True
            elif sum == n:
                break

            elif sum > n:
                counter = 1
                break
        if s < n :
            s += 1
        elif s == n:
            answer += 1
            break
        else :
            break
        if counter == 0 :
            answer += 1 

    return answer

대충 보니 아래의 것에서 외부 for문을 while문으로 만든거 같고 나머지는 비슷하다.
while문으로 하려다보니 counter도 들어갔고 줄도 되게 길어졌다.

아래는 두번째로 짠 코드.
훨씬 간결해졌다.

def solution(n):
    answer = 0
    
    for i in range(1, n+1):
        temp = 0
        for j in range(i,n+1):
            temp += j
            if temp > n:	#8번째 줄
                break		#9번째 줄
            if temp == n:
                answer+=1
                break
    
    return answer

두번째로 짠 코드는 매우 직관적이다.
하지만 이중for문 때문에 효율성테스트에서 시간초과가 된것.
8번째, 9번째 줄을 추가해 해결했다.
두 줄의 역할은 단순하게도 합(temp)이 n보다 커지면 그냥 그즉시 멈추고 다음 숫자부터 덧셈을 시작한다.

테스트 케이스로 n = 15 일때
2부터 더하기 시작할 때
저 두줄이 없으면 15가 넘어가도 계속 더하고 결국 14번 다돌게된다.
만약 숫자가 커지면 말도 안되게 커질것.
2중 for문이라 시간복잡도가 O(n^2)여서 n의 제약조건이 없거나 더 큰수였다면 아마 더 최적화가 필요했을 것으로 보인다.

찾아보니 dp를 활용해 푸는 문제라고 한다.

0개의 댓글