Front-End/Algorithm

[프로그래머스 / JavaScript] Lv.1 두 개 뽑아서 더하기

Olivia Kim 2023. 3. 16. 23:45
반응형

 

문제

정수 배열 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://oliviakim.tistory.com/43

 

[JavaScript] .sort() 함수를 이용해 배열의 요소 정렬하기

설명 Array.prototype.sort()는 배열의 요소를 적절한 위치에 정렬한 후, 그 배열을 반환한다. 이때 배열 안 모든 요소는 문자형으로 변환된 후, 유니코드 단위의 값을 비교한 뒤 재정렬된다. 배열 안의

oliviakim.tistory.com

 

 

 

반응형