(JS) Programmers : 두 개 뽑아서 더하기

호두파파·2021년 1월 18일
0

메모

목록 보기
4/18

문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.


제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
    • numbers의 모든 수는 0 이상 100 이하입니다.

입출력 예 설명

입출력 예 #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 해야 합니다.

접근 방법

  • 문제를 접했을때는 가장 먼저 배열에 접근할 수 있는 메소드와 배열을 정렬하는 메소드를 사용하면 되겠다는 생각을 했다.
  • 가장 먼저 정수 배열 numbers에서 숫자를 2개를 뽑아내서, 숫자를 빈 배열에 넣고, 다시 그 빈 배열의 합을 더하는 복잡한 방식을 사용하려고 했다.
const numbers = [1, 2, 3, 4, 5];
let answer = [];

function makeNumber() {
  let temp = [];
    for (let j = 0; j < 2; j++) {
    let picked = numbers.pop();
    temp.push(picked); // 2. 숫자 2개를 뽑아서 빈 배열에 넣기 
    }
    const sum = temp.reduce((stack, el)=>{
      return stack + el;
    }, 0); // 3. 빈 배열의 원소 2개의 합을 더한 값을 다시 빈 배열(answer)에 넣기
    answer.push(sum);    
 }

하지만 위와 같은 방식으로 문제를 진행하기에 문제가 몇가지가 발생하는데,

  1. Array.prototype.pop 메소드 뿐만 아니라 배열에서 요소를 뽑아내는 메소드는 문자 그대로 원 배열에 영향을 끼친다. (slice는 원배열에 영향을 주지는 않지만, 배열을 뽑아내는 구간을 선택해줘야 하는 등 제약이 있다.)

참고 링크 : JavaScript - 배열에서 값 추출, 추가하기

  1. 때문에 위에 방식으로 문제를 진행할 수 없었다. 그래서 새롭게 접근한 방식은 for 문을 두번 돌려서 numbers배열의 요소를 두개를 비교할 수 있도록 내부에 조건문을 사용하는 방식이었다. 결과적으론 이 방식이 제일 직관적으로 문제를 해결할 수 있었다.
function solution(numbers) {
    const answer = [];
    for (let i = 0; i < numbers.length; i++) {
      for (let j = 0; j < numbers.length; j++) {
        if (i !== j) {
          answer.push(numbers[i]+numbers[j]);         
        }
      }
    }
  1. 하지만 여기서 주의해야할 점은 push 메소드로 빈 배열로 들어가는 요소 중 중복되는 값이 발생한다는 것이다.

뗴문에, 중복값을 제거해주는 메소드를 사용해줘야 한다. 이후 배열을 오름차순으로 정렬하면 문제 해결!

https://velog.io/@awesomelon/배열에서-중복값-제거하는-방법JS

자바스크립트 정렬 함수, sort()

const result = Array.from(new Set(answer));
    result.sort((a, b) => a - b);
    return result
}

function solution(numbers) {
    const answer = [];
    for (let i = 0; i < numbers.length; i++) {
      for (let j = 0; j < numbers.length; j++) {
        if (i !== j) {
          answer.push(numbers[i]+numbers[j]);         
        }
      }
    }
    const result = Array.from(new Set(answer));
    result.sort((a, b) => a - b);
    return result
}

다른 문제 풀이

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)
}
profile
안녕하세요 주니어 프론트엔드 개발자 양윤성입니다.

0개의 댓글