연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수
num
과total
이 주어집니다. 연속된 수num
개를 더한 값이total
이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
- 1 ≤
num
≤ 100- 0 ≤
total
≤ 1000num
개의 연속된 수를 더하여total
이 될 수 없는 테스트 케이스는 없습니다.
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] 입출력 예 설명
function solution(num, total) {
const result = [];
// 중앙 숫자가 정수인 경우
if (total % num === 0) {
// 중앙 숫자 계산
const middle = Math.floor(total / num);
// 중앙을 기준으로 좌우로 num/2 개의 숫자를 더해줌
for (let i = 0; i < num; i++) {
result.push(middle - Math.floor(num / 2) + i);
}
} else { // 중앙 숫자가 소수인 경우
const leftMiddle = Math.floor(total / num);
const rightMiddle = Math.ceil(total / num);
// 왼쪽 숫자부터 추가
for (let i = 0; i < num / 2; i++) {
result.unshift(leftMiddle - i);
}
// 오른쪽 숫자 추가
for (let i = 0; i < num / 2; i++) {
result.push(rightMiddle + i);
}
}
return result;
}
생각하기
- 연속된 수 num 만큼 더해서 total을 완성하는 작업.
- 생각해봤는데, total에서 num을 나눴을때 나오는 숫자가 중앙 숫자고, num을 기준으로 index[중앙숫자-i] + index[중앙숫자+i] 만큼 해주면 되는게 아닐까?
- 그리고 소숫점으로 나오면, 중앙숫자가 그 중앙의 2개인거임. ex) 3.5로 나오면 중앙숫자가 3/4를 중앙값로 삼고, 다시 index[중앙숫자-i] 와 index[중앙숫자+i] 하면 되는거지.
- 다만 왼쪽 오른쪽으로 다시금 나뉘었으니 i < num/2 해야함.
function solution(num, total) {
var min = Math.ceil(total/num - Math.floor(num/2));
var max = Math.floor(total/num + Math.floor(num/2));
return new Array(max-min+1).fill(0).map((el,i)=>{return i+min;});
}
예제 4번을 기준으로 보자.
min
계산max
계산Array
를 통해 배열을 만들어주고, 그것을 fill
을 통해 채워준다, 그 후 map
을 통해 i + min 값을 출력한다.
.Map(el, idx, arr)
: 원본 데이터를 변형하지 않고, 새로운 함수를 만들어 낸다.
- element: 현재 요소의 값
- index: 현재 요소의 인덱스
- array: 원본 배열 자체