프로그래머스 lv1
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
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) {
let answer = [];
// 중복된 수를 제외한 합의 배열
for (let i=0; i<numbers.length; i++){
for (let j=0; j<numbers.length; j++){
let num = numbers[i]+numbers[j]
if(i !== j && answer.indexOf(num) < 0){
answer.push(numbers[i]+numbers[j]);
};
};
};
// 삽입정렬 -> 오름차순 정리
for(let n=1; n<answer.length; n++){
let key = answer[n];
let m = n-1;
while( m >=0 && answer[m]>key){
answer[m+1] = answer[m];
m--;
};
answer[m+1] = key;
}
return answer;
};
정렬알고리즘을 공부하는 중 공부한 삽입정렬을 써볼 수 있는 예제였다. 아직 내가 짠 알고리즘의 성능, 메모리 사용량, 복잡도 등을 생각하며 알고리즘을 쓸 수 있는 단계는 아니지만, 나름 공부한 알고리즘을 사용해볼 수 있는 예제였다.
-> 물론...JS내장메소드를 사용해서 더 간단하게 작업할 수 있다...ㅜㅜ
function solution(numbers) {
let answer = [];
for(let i=0; i < numbers.length; i++){
for(let j=0; j<numbers.length; j++){
if(i===j) continue; // 동일한 index는 skip
answer.push(numbers[i]+numbers[j])
}
}
answer = [...new Set(answer)].sort((a,b)=>a-b)
return answer;
}
function solution(numbers) {
const temp = []
for (let i = 0; i < numbers.length; i++) {
for (let j = i + 1; j < numbers.length; j++) {
temp.push(numbers[i] + numbers[j])
}
}
const answer = [...new Set(temp)]
return answer.sort((a, b) => a - b)
}
: Set 객체는 자료형에 관계 없이 원시 값과 객체 참조 모두 유일한 값을 저장할 수 있습니다.
⇨ ES6가 등장하기 이전에는 자바스크립트 자체는 set을 구현하고 있지 않았습니다. 근데, set이 뭘까요?
Set은 데이터 타입 중의 하나인데, 중복되는 값을 가지지 않는 값들의 리스트입니다. 그리고 이 때 값은 순서가 존재하지 않죠.
new Set([iterable])
새로운 set을 만들때 new Set() 을 활용합니다. 이 때 구성자에 반복자(iterator)를 직접 작성할 수 있습니다.
const foo = new Set(); console.log(foo) // Set {} // const bar = new Set([ 1, 2, 3 ]); console.log(bar) // Set { 1, 2, 3 }
⭐️ 그런데 set을 만들 때 중복되는 값을 가진 반복자를 넘기면, Set이 알아서 중복되는 값들 중 맨 앞의 값만 남기고 무시합니다.
const foo = new Set([ 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5 ]); console.log(foo); // Set { 1, 2, 3, 4, 5 }
위에서 살펴봤듯이, 배열을 Set 으로 바꾸는 방법은 쉽습니다. Set 구성자에 배열을 넘기기만 하면 되었죠. 반대로 set을 배열로도 바꿀 수 있는데, 바로 전개 연산자(spread operator)를 활용하면 됩니다.
const foo = new Set([ 1, 2, 3 ]); const fooInArray = [ ...foo ]; console.log(fooInArray) // [ 1, 2, 3 ];
: sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다
⭐️ 즉, 이때, 원본 배열인 arr가 정렬이 되고, 리턴하는 값 또한 원본 배열인 arr을 가리키고 있다.
arr.sort([compareFunction])
compareFunction는 a, b 두 개의 파라미터를 받고 두 숫자의 차가 양수값이냐, 음수값이냐를 이용하여 숫자를 오름차순으로 정렬할 수 있다.
function compareNumbers(a, b) { return a - b; }
⇨ break - 반복문에서 더 이상 반복문을 진행하지 않고 종료하고자 할 때 사용
⇨ continue - 반복문에서 현재 실행중인 반복문을 멈추고 다음 반복문으로 바로 진행할 때 사용
break 문과 달리 continue는 루프의 실행을 완전히 종료하지 않고 for, while문에서 다음과 같이 동작합니다.
continue 문에는 현재 루프 대신 레이블이 지정된 루프 문의 다음 반복으로 건너 뛰도록하는 선택적 레이블이 포함될 수 있습니다. 이 경우, continue 문은 이 레이블 된 명령문 내에 중첩되어야합니다
이는 다른 포스팅에서 정리할 예정이다.
for (let count = 1; count < 6; count++){ if (count == 3) continue; console.log("count = " + count); } // 1 2 4 5
출처: https://devjhs.tistory.com/114 [키보드와 하루]