정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
numbers의 길이는 2 이상 100 이하입니다.
numbers의 모든 수는 0 이상 100 이하입니다.
numbers result [2,1,3,4,1] [2,3,4,5,6,7] [5,0,2,7] [2,5,7,9,12]
function solution(numbers) {
//이중포문을 해야하나 //for문한번씩 돌면서 시작 index를 올리면
//어차피 중복되니까 1번째 숫자랑 다 더한거 넣으면 되네
//sort 오름차순 정렬 ㄱ
let answer = [];
const arrLen = numbers.length; //5
let fix = 0;
while(fix < arrLen-1){
let firstNum = numbers[fix];
for(let i = fix+1; i < arrLen; i ++){
answer.push(firstNum + numbers[i])
}
fix += 1;
}
answer = answer.sort((a,b) => a - b)
let set = new Set(answer);
let newArr = [...set];
answer = newArr;
console.log(newArr);
return answer;
}
저렇게 적어 놓고 제출을 하였지만 문제를 풀면서 몇가지 더 깨달은 것은
경우의 수를 항상 먼저생각하고 for문의 여부를 생각해야한다는 것 같다.
처음에 반복문 하나로 돌리겠다는 우매함은 결국 무너졌다 :)...
그리고 js에서 배열내의 중복을 처리하는 방법은 크게 3가지가 존재한다.
중복을 허용하지 않는 Set자료형 특징을 살려 이용
const arr = [1,1,1,2,3,4,4,5,5];
const set = new Set(arr);
const newArr = [...set];
console.log(newArr);
//[ 1, 2, 3, 4, 5 ]
조건에 부합하는 것만을 Return하는 특성을 가진 filter메서드와
해당 인자의 index를 찾는 메서드인 indexOf를 사용하여 필터링 해주는 방법
const arr = [1,1,1,2,3,4,4,5,5];
const newArr = arr.filter((el, idx) => {
return arr.indexOf(el) === idx;
})
console.log(newArr);
//[ 1, 2, 3, 4, 5 ]
forEach반복문을 돌며 포함여부(includes 메서드)를 판단하여 새로운 배열에 넣어주는 방법
const arr = [1,1,1,2,3,4,4,5,5];
let newArr = [];
arr.forEach((el)=>{
if(!newArr.includes(el)){
newArr.push(el)
}
});
console.log(newArr);
참고