프로그래머스 lv 0 - 연속된 수의 합
문제 설명
연속된 세 개의 정수를 더해 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를하면 정수가 되기때문에 버려줄 필요가 없다.
이후 리스트 내포로 리스트값 반환.