연속된 수의 합

이재근·2022년 12월 15일
0

문제 = result는 sum을 length로 가지고 있고 모든 elemen는 연속된 수이며 모두 더했을 때 total 이 된다.
이때 resule를 구하시오.

function solution(num, total) {
var answer = [];
let zeroSum = 0;
let start = 0;
for (let i = 0 ; i<num ; i++){
zeroSum+=i
}
for(let k=0; k<100; k++){
if (total > zeroSum){zeroSum+=num;
start ++;
}
else if (total < zeroSum){zeroSum-=num;
start --;
}
else if (total === zeroSum){
break;
}
}
for(let j = 0 ; j<num ; j++){
answer.push(start);
start++;
}
return answer;
}

나의 풀이 - 1~sum의 모든 element를 더한 값 zeroSum을 구한다.
result의 첫 element가 1에서 1만큼 달라질때 total의 값은 sum만큼의 차이를 가진다.
반복문을 통해 zeroSum과 total 이 오차를 보일 때마다 result의 첫번째 element인 start 값을 1만큼 더하거나 뺀다. zeroSum과 total이 값이 같아졌을 경우 result의 값은 만큼의 length를 가지는 start부터 시작하는 연속된 수 이다.

////

다른 사람( J)의 풀이.

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;});

}
Math.ceil() - number를 받고 소수점을 올림하여 정수를 반환합니다.
최소값 = 올림 값(num을 total로 나눈 값-num/2값의 올림 값)
Math.floor() - number를 받고 소수점을 내림하여 정수를 반환합니다.
최대값 = 내림 값(numdmf total로 나눈 값-num/2의 올림 값)
new array 어레이 생성 array에 array(element 갯수)를 생성 , arr.fill(value,start index(option), end index(option))array의 element 값을 start index부터 end index까지 value로 변환한다.
.map 다음의 함수의 결과값으로 구성된 arr를 반환한다.
(element, index(option), array(option),thisarr)
(el,i)=>{return i+min} min과 index값을 더한 값이 elm의 값이 된다.
[최소값, 최소값+index, 최소값+index, ...]

다른사람(J)의 연산속도가 약 2배 빠르다.

new arr().fill().map(()=>)을 활용하여 array.push가 아닌 생성과 값 입력을 동시에 해보도록 하자.

profile
하루 고생하면 코드가 나 대신 일해준다.

0개의 댓글