프로그래머스 Lv1
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
numbers | result |
---|---|
[2,1,3,4,1] | [2,3,4,5,6,7] |
[2, 36, 1, 3] | [1, 2, 3, 36] |
[5,0,2,7] | [2,5,7,9,12] |
2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)
3 = 2 + 1 입니다.
4 = 1 + 3 입니다.
5 = 1 + 4 = 2 + 3 입니다.
6 = 2 + 4 입니다.
7 = 3 + 4 입니다.
따라서 [2,3,4,5,6,7] 을 return 해야 합니다.
2 = 0 + 2 입니다.
5 = 5 + 0 입니다.
7 = 0 + 7 = 5 + 2 입니다.
9 = 2 + 7 입니다.
12 = 5 + 7 입니다.
따라서 [2,5,7,9,12] 를 return 해야 합니다.
function solution(numbers) {
const 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;
};
사실 이 알고리즘을 올해 초에 풀었던 터라 왜 이렇게 복잡하고, 쓸데없는 코드를 써서 풀었는지 모르겠다. 아마 삽입정렬을 처음 보았던 때라서 한번 써보고 싶었었나보다.
조금 더 간단하게 바꿔보자.
(삽입정렬 부분 -> sort()메소드로 바꿈.)
function solution2(numbers){
const answer = [];
for(let i=0; i<numbers.length; i++){
for(let j=i+1; j<numbers.length; j++){
if(answer.indexOf(numbers[i]+numbers[j]) === -1){
answer.push(numbers[i]+numbers[j]);
}
}
}
return answer.sort((a,b)=> a-b)
}
indexOf()메소드의 찾으려는 요소가 없을때, -1을 반환한다는 것을 이용하여 answer배열에 중복되는 값이 들어가는 것을 방지하였다.
: indexOf( ) 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환합니다.
구문
arr.indexOf ( searchElement [, fromIndex])
매개변수
searchElement: 검색요소
배열에서 찾을 요소입니다.
fromIndex( Optional )
검색을 시작할 색인입니다. 인덱스가 배열의 길이보다 크거나 같은 경우 -1이 반환되므로 배열이 검색되지 않습니다. 제공된 색인 값이 음수이면 배열 끝에서부터의 오프셋 값으로 사용됩니다. 참고 : 제공된 색인이 음수이면 배열은 여전히 앞에서 뒤로 검색됩니다. 계산 된 인덱스가 0보다 작 으면 전체 배열이 검색됩니다. 기본값 : 0 (전체 배열 검색).
반환 값
배열 내의 요소의 최초의 인덱스. 발견되지 않으면 -1.
설명
indexOf()는 엄격한 동등성 (=== 또는 triple-equals 연산자에서 사용하는 것과 같은 메서드)을 사용하여 검색 요소를 Array의 요소와 비교합니다.
문자열 또한 같은 메소드를 가지고 있고, 역할 또한 같다.
※ String.prototype.indexOf()
JS에 구현되어있는 Set자료구조를 사용하여 더 간단히 풀 수 있다.
:Set 객체는 자료형에 관계 없이 원시 값과 객체 참조 모두 유일한 값을 저장할 수 있습니다.
구문
new Set( [ iterable ] );
매개변수
반환 값
새로운 Set 객체.
설명
Set 객체는 값 콜렉션으로, 삽입 순서대로 요소를 순회할 수 있습니다. 하나의 Set 내 값은 한 번만 나타날 수 있습니다. 즉, 어떤 값은 그 Set 콜렉션 내에서 유일합니다.
function solutionSet(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);
}
왜 spread Operator ( 전개 연산자 )??
⇨ [Javascript] Set 객체를 배열(Array)로 변환하는 3가지 방법