연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다.
두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때,
정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
그렇다.. 그냥 연속된 수의 합이다..
두개의 인자가 주어진다.
첫번째, num 정수이며 더해야 할 숫자들의 총 갯수를 뜻한다.
두번째, total 정수이며 다 더했을 때 이 값이 되면 된다...
난 다시한번 내가 비전공에 수포자였음에 좌절하였다....
이런저런 메소드와 반복문 기타 등등이 생각났지만
수학적인 해법은 전혀 떠오르지 않았다... 그래서 역시 무식하게 마구 풀었다..
function solution(num, total) {
var answer = [];
// 가운데 값 구하기
const middle = parseInt(total / num);
// 센터 인덱스 변수 선언
let centerIdx = 0;
// num 이 짝수면 홀수면
if(num % 2 === 0){
// 짝수면 센터 인덱스는 num/2 한 뒤 1 빼주기
centerIdx = num / 2 - 1;
}else{
// 홀수면 센터 인덱스는 num/2 한 뒤 버림
centerIdx = Math.floor(num / 2);
}
// 배열 생성
answer = Array.from({length : num});
// num 기준으로 반복문
for(let i = 0; i < num; i++){
// 현재 인덱스와 센터 인덱스의 차이 구하기
const diff = Math.abs(centerIdx - i);
// 센터 인덱스면 처음에 구한 가운데 값
if(i === centerIdx){
answer[i] = middle;
// 센터 인덱스보다 전이면 가운데 값에서 차이만큼 빼기
}else if(i < centerIdx){
answer[i] = middle - diff;
// 센터 인덱스보다 후면 가운데 값에서 차이만큼 더하기
}else{
answer[i] = middle + diff;
}
}
return answer;
}
매우길고 비효율적 ㅠㅠ
다른 분들의 풀이를 보았더니
역시 시퀀스 구하기 비슷한걸 쓰고 있었다.
근데 저 최소 최대값 구하는 공식은 대체 뭐냐구...
저대로 계산 해보면 그렇게 나오는 건 알겠는데
어째 저런 생각이 안냐나구 ㅠㅠ
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;});
}
갈길이 멀다....
'algorithm' 카테고리의 다른 글
코테9 - 피자 나눠먹기 (0) | 2024.03.10 |
---|---|
코테8 - 종이자르기 (0) | 2024.03.10 |
코테6 - 배열의 유사도 (0) | 2024.03.04 |
코테5 - 다음에 올 숫자 (0) | 2024.03.04 |
코테4 - 붕대감기 (0) | 2024.03.02 |