프로그래머스에서 코딩테스트 연습4 - 두 개 뽑아서 더하기
임의의 배열에서 두 수를 뽑아 더해서 만들 수 있는 모든 수를 나타내기
ex) [2,1,3,4,1] -> [2,3,4,5,6,7]
배열[0]번일 때 배열[0]을 고정시키고 배열[1], 배열[2], 배열[3]... 를 각각 배열[0]과 더하고
배열[1]번일 때 배열[1]을 고정시키고 배열[2], 배열[3], 배열[4]... 를 각각 배열[1]과 더하는 방식을 이용하였다.
index가 증가함에 따라 i의 초기값도 증가해야 하므로 i와 index를 연결하였다.
function solution(numbers) {
var answer = [];
let result = [];
for(let index = 0; index < numbers.length; index++){
for(let i = index+1; i < numbers.length; i++){
result.push(numbers[index] + numbers[i]);
}
}
answer = [...new Set(result)].sort(function(a,b){return a-b});
return answer;
}
오늘 이 문제를 풀면서 많은 것을 깨달았다.
첫 번째는 for(index in arr){}를 이용하면 index가 숫자를 갖고는 있지만 실제로는 String 타입이라는 것이다.
for(index in arr){
// index는 String 속성이다.
for(let i = index+1; i < arr.length; i++){}
// i는 number의 값을 가진다.
console.log(index+1); // index+1은 String + Number이기 때문에 1이 아닌 01이 나온다.
}
자꾸 NaN값이 나오길래 왜 그러는지 확인했더니 console.log로 확인해보니 값이 01, 02, 03... 이따구로 나왔다.
console.log(index);는 0, 1, 2... 가 나오지만 console.log(typeof index);는 String이 나왔다...(충격). 안 되는 이유가 있었던 것이다.
두 번째는 new Set()은 sort로 정렬이 되지 않는다는 점이다.
처음에는 이렇게 작성하였는데 문법적 오류라고 나왔다.
answer = new Set(result).sort(function(a,b){return a-b});
console.log로 확인을 하니 Set {num, num, num...}라고 나왔다. Set()은 순서가 없이 무작위로 호출된 값이기 때문에 list정렬이 안 되는 것이었다.
new Set()를 그대로 이용하지 않고 전개연산자로 복사하여 sort를 하니 해결되었다.