티스토리 뷰

문제설명

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이하의 자연수

 

입출력 예

 

접근 방법

1. 리스트를 선언 후 투포인터를 이용한다. 

2. n이 될때까지 rt를 1씩 더해준다.

3. 만약 num이 n과 같을 경우 answer +1

   - 만약 num이 n보다 클경우 num에서 lt를 빼주고, lt를 1씩 더해준다.

4. 문제에서 자기 자신인 경우에도 경우의 수로 count하고 있으므로, 1부터 시작한다.

 

 

그림으로 나타내면 다음과 같은 형태이다.

 

 

정답 소스코드

더보기

매우 지저분한.. 정답 소스코드

def solution(n):
    answer = 1
    m = (n//2) +1
    numList = [i for i in range(1, n)]
    
    lt = 0
    rt = 0
    num = 0
    
    if n <=2:
        return 1   
    
    while rt < m :
        num += numList[rt]
        rt += 1
        if num == n:
            answer +=1
        elif num >= n:
             while num >= n:
                num -=numList[lt]
                lt +=1
                if num == n:
                    answer +=1 

    return answer

 해당 코드 문제점

  - n이 1, 2인 경우에는 numList가 빈 배열로 생성되어, out of index 에러가 발생하게 된다.

 - 따라서 n이 1, 2인 경우에는 1를 리턴해주도록 if문을 사용하였다.

 

 

 chatGPT3.5 에게 개선 요청한 소스코드

더보기

심지어 효율도 더 좋다.

def solution(n):
    count = 1  # 자기 자신으로 표현하는 경우를 미리 카운트합니다.
    left, right, total = 1, 1, 1

    while left <= n // 2:
        if total == n:
            count += 1

        if total < n or left == right:
            right += 1
            total += right
        else:
            total -= left
            left += 1

    return count
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함