프로그래머스 연속된 수의 합 [ Python ]

2023. 4. 18. 23:28알고리즘/프로그래머스

문제 설명
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.



제한사항

1 ≤ num ≤ 100
0 ≤ total ≤ 1000


num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.



입출력 예

num total result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
4 14 [2, 3, 4, 5]
5 5 [-1, 0, 1, 2, 3]


입출력 예 설명


입출력 예 #1

num = 3, total = 12인 경우 [3, 4, 5]를 return합니다.
입출력 예 #2

num = 5, total = 15인 경우 [1, 2, 3, 4, 5]를 return합니다.
입출력 예 #3

4개의 연속된 수를 더해 14가 되는 경우는 2, 3, 4, 5입니다.
입출력 예 #4

설명 생략


코드

def solution(num, total):
    answer = []

    avg = total // num
    # avg 변수에 평균값을 넣어준다. 이 평균값은 리스트의 중간숫자이다.
    
    for i in range(0, num):
        answer.append(i)
    # 리스트를 0 부터 인덱스인 num 까지 넣어준다.
    
    end_loop = 0
    # while 문을 종료시키기 위한 end_loop 변수 선언
    # while 문은 end_loop 변수가 1 이 되면 루프를 종료한다.
    while end_loop != 1:
        sumList = sum(answer)
        # answer 의 모든 리스트 값을 더해 sumList 에 저장한다.
        for i in range(0, num):
            # 인덱스의 길이만큼 for문을 반복한다.
            if sumList < total:
                answer[i] += 1
                # answer 의 합계보다 문제에서 준 total 을 비교해 total 값이 크면 
                # answer 의 값들을 1 더해준다.
            if sumList > total:
                answer[i] -= 1
                # answer 의 합계보다 문제에서 준 total 을 비교해 total 값이 크면 
                # answer 의 값들을 1 빼준다.
            if sumList == total:
                end_loop = 1
                break
                # answer 의 합계와 문제에서 준 total 이 같으면 while 문을 종료한다.
        
    return answer

 

Awesome 코드

 

# 1

def solution(num, total):
    return [(total - (num * (num - 1) // 2)) // num + i for i in range(num)]


# 2

def solution(num, total):
    answer = []
    var = sum(range(num+1))
    diff = total - var
    start_num = diff//num
    answer = [i+1+start_num for i in range(num)]
    return answer

# 3

def solution(num, total):
    if num % 2 == 1:
        return list(range(total//num-num//2, total//num+num//2+1))
    else:
        return list(range(total//num-num//2+1, total//num+num//2+1))

회고

이번 문제는 풀면서 파이썬의 장점을 하나도 못살린 것 같았다. 다른 사람들의 코드를 봤을때 부족함을 많이 느꼈다.

코드의 길이 뿐만 아니라 반복문 한번으로 문제를 끝낸다는 것이 인상적이었다. 

 

추가로 블로그에 다 못올린 프로그래머스 문제는 개인 Github 에 올리고있다. 아래에 링크남긴다.

https://github.com/munyeol-Yoon/programmers-prac

 

GitHub - munyeol-Yoon/programmers-prac

Contribute to munyeol-Yoon/programmers-prac development by creating an account on GitHub.

github.com