파이썬 알고리즘 문제풀이/구현

프로그래머스 lv 0 - 연속된 수의 합

monsangter 2022. 11. 6. 01:08

 

문제 설명

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


제한사항
  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

입출력 예numtotalresult
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

  • 설명 생략

연속된 수 num개의 리스트의 모든 엘리먼트를 합하면 total이 돼야 한다. 그리고 그 조건을 만족시키는 리스트를 반환해야한다.

 

total을 num으로 나눠보면 중앙값이 나온다. 홀수인 경우에는 딱 중앙 값이.

짝수인 경우에는 중앙값이 존재하지 않으니, 중앙 두 수를 더한 평균과 같다.

공차가 1 인 등차와 같기 때문이다.

 

이제 중앙에 있는 수의 값과 리스트안에서 상대적 위치를 알게 되는 것이다.

 

따라서 리스트의 첫 요소도 알 수 있게 된다.

 

이후에는 num으로 리스트의 길이를 알고 있으니 첫수부터 연속된 num개의 수를 가진 list를 반환하면 된다.

 

첫수의 값을 받아줄 변수 init을 선언하자.

 

1. 홀수인 경우. 첫수.

if num % 2 == 1:
        init = int(total/num - math.floor(num/2))

중앙값에서 배열의 길이 num을 2로 나눠 버림한 값을 중앙값에서 빼주면 맨 앞의 숫자가 나온다.

 

2.짝수인 경우.

init = int(math.floor((total/num) - num/2 + 1) )else:    
        init = int(total/num - num/2 + 1) 

중앙값에서 배열의 길이 num을 2로 나눈 값을 빼고 1을 더하면 맨앞 숫자가 나온다.

여기서 주의할 것은 total/num또한 소수 이기때문에  num/2를하면 정수가 되기때문에 버려줄 필요가 없다.

 

이후 리스트 내포로 리스트값 반환.