문제
정수 배열 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] |
입출력 예 #1
- 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
- 2 = 0 + 2 입니다.
- 5 = 5 + 0 입니다.
- 7 = 0 + 7 = 5 + 2 입니다.
- 9 = 2 + 7 입니다.
- 12 = 5 + 7 입니다.
- 따라서 [2,5,7,9,12] 를 return 해야 합니다.
내가 작성한 답안
# 1차로 작성한 답안 ❌
function solution(numbers) {
let sumArr = [];
// 본인 인덱스를 제외한 나머지 요소들과의 합을 배열에 넣는다.
for(let i = 0; i < numbers.length; i++) {
for(let j = 0; j < numbers.length; j++) {
if(i !== j) {
sumArr.push(numbers[i] + numbers[j]);
}
}
}
// 중복을 허용하지 않는 set을 사용해 새로운 배열에 중복 제거값을 넣는다.
const set = new Set(sumArr);
const uniqueArr = [...set];
// sort를 사용해 답안과 같이 오름차순으로 return한다.
return uniqueArr.sort();
}
- 입력값이 [2, 1, 3, 4, 1] 일 때 기댓값은 [2, 3, 4, 5, 6, 7], 출력값 [2, 3, 4, 5, 6, 7]
- 입력값이 [5, 0, 2, 7] 일 때 기댓값은 [2, 5, 7, 9, 12], 출력값 [12, 2, 5, 7, 9]
문제사항
sort()는 숫자를 문자로 변환한 뒤 유니코드 기준으로 크기 비교하여 정렬하기 때문에 정렬이 제대로 적용되지 않았다.
해결방법
비교함수를 전달하여 숫자의 크기에 따라 정렬하도록 한다.
return uniqueArr.sort((a, b) => a - b);
# 최종 답안 ⭕
function solution(numbers) {
let sumArr = [];
for(let i = 0; i < numbers.length; i++) {
for(let j = 0; j < numbers.length; j++) {
if(i !== j) {
sumArr.push(numbers[i] + numbers[j]);
}
}
}
const set = new Set(sumArr);
const uniqueArr = [...set];
return uniqueArr.sort((a, b) => a - b);
}
# 추가로 고민해 볼 것들 💡
❓ 이중 for문, if문을 좀 더 간결하게 줄일 방법이 없을까?
❓ 중복된 수를 제거할 때 set과 다른 방법 중 어떤 게 더 빠를까?
다른 사람들이 작성한 답안
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)
}
위에서 내가 고민했던 것이 반영된 멋진 풀이다!
이 문제는 한 줄 서기 경우의 수처럼 이미 더해진 경우는 제외해야 했다. 나는 이를 if(i !== j) { ... } 문을 이용하여 풀었는데, 위의 풀이와 같이 j의 초기값을 아예 i + 1로 한다면 이미 더해진 경우는 빠지게 된다. 내가 고민했던 것에서 한 발짝 더 앞으로 나아간 멋진 방법이다.
set을 이용해 중복제거를 할 때도 한 줄에 간결하게 해당 내용을 담았다. 눈에 많이 봐두고 내 것이 될 수 있도록 익혀야겠다.
[참고 자료]
https://school.programmers.co.kr/learn/courses/30/lessons/68644
https://oliviakim.tistory.com/43
'Front-End > Algorithm' 카테고리의 다른 글
[프로그래머스 / JavaScript] Lv.1 핸드폰 번호 가리기 (0) | 2023.04.08 |
---|---|
[프로그래머스 / JavaScript] Lv.0 합성수 찾기 (0) | 2023.03.18 |
[프로그래머스 / JavaScript] Lv.0 제곱수 판별하기 (0) | 2023.02.21 |
[프로그래머스 / JavaScript] Lv.1 문자열 내 마음대로 정렬하기 (0) | 2023.02.15 |
[프로그래머스 / JavaScript] Lv.1 최소직사각형 (0) | 2023.02.14 |