[프로그래머스]두 개 뽑아서 더하기

jaemin·2020년 9월 17일
0

프로그래머스

목록 보기
1/1
post-thumbnail

두 개 뽑아서 더하기

문제 설명

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

입출력 예시 :

numbersresult
[2,1,3,4,1][2,3,4,5,6,7]
[5,0,2,7][2,5,7,9,12]

문제 :

function solution(numbers) {
    var answer = [];
    return answer;
}

풀이 과정 :

풀이 과정은 꼭 여러 번 고민하고 생각해본 후 보도록 하자.

먼저, 모든 수를 중복없이 오름차순 해야한다는 조건은 배제하고 numbers 배열의 두 수를 뽑아 더하는 과정을 먼저 해보자.
반복적으로 numbers 요소에 접근해야 하므로 for문을 사용해야 한다.

function solution(numbers) {
    var answer = [];
    for ( let i = 0; i < numbers.length; i++) {
      for ( let j = i + 1; j < numbers.length; j++) {
        let sum = number[i] + number[j];
      }
    }
    return answer;
}

for문을 도는 횟수는 numbers 배열의 길이만큼 돌아야 한다. j의 시작점을 생각해보면 문제에서 서로 다른 인덱스에 있는 두 수를 뽑아 라는 말이 있다.
인덱스가 겹치지 않으려면 어떤 조건을 걸어줘야 할까?

  1. if문을 사용해 i와 j가 같지 않은 경우에만 합을 구할 수 있다.
  2. j가 무조건 i보다 1 큰 수에서 시작하면 된다.
    => 이 방법은 고등학생때 배운 경우의 수 문제에서 5명의 사람이 모두 서로 악수하는 경우의 수를 구하는 문제를 떠올리게 했다.

두 가지 경우가 있지만 제어문을 사용하는 것은 코드의 흐름을 깨뜨리므로 최대한 지양하는 것이 좋으므로 2번 방법을 택했다.

이제 중복된 숫자를 제거하고 오름차순으로 담아야 한다.
중복된 숫자를 제거하는 방법과 오름차순으로 배열하는 방법은 알지 못해 여기서 많이 헤맸다.

먼저, 중복된 숫자를 제거해보자.

function solution(numbers) {
    var answer = [];
    for ( let i = 0; i < numbers.length; i++) {
      for ( let j = i + 1; j < numbers.length; j++) {
        let sum = number[i] + number[j];
        if( answer.indexOf(sum) === -1) {
          answer.push(sum);
        }
      }
    }
    return answer;
}

indexOf 메서드를 이용해 answer 배열에 내가 구한 합이 없다면 그 수를 담았다. 아직 이런 메서드에 대해 깊이 알지 못해 이 방법이 최선의 방법인지는 알 수 없었다.

이제, 오름차순으로 담아보자.

function solution(numbers) {
    var answer = [];
    for ( let i = 0; i < numbers.length; i++) {
      for ( let j = i + 1; j < numbers.length; j++) {
        let sum = numbers[i] + numbers[j];
        if( answer.indexOf(sum) === -1) {
          answer.push(sum);
        }
      }
    }
    answer.sort(function(a,b) {
      return a - b;
    })
    return answer;
}

오름차순으로 배열을 담는 방법은 [정렬하려는 배열].sort(function(a,b) {return a-b;}) 라고 한다.
화살표 함수를 사용하여 answer.sort ((a,b) => a-b) 작성하여도 좋다.

이 함수를 정확하게 이해하지는 못했다. 이후에 이에 대해 포스팅 해보도록 하겠다.

다른 사람의 풀이

function solution(numbers) {
    var answer = [];
    const set = new Set();
    for(let i = 0; i < numbers.length; ++i){
        let sum = 0;
        for(let j = 0; j < numbers.length; ++j){
            if(i != j){
                set.add(numbers[i] + numbers[j]);
            }
        }
    }
    set.forEach((number)=>{
        answer.push(number);
    })
    answer.sort((a,b)=>(a-b));
    return answer;
}
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)
}

느낀점

요즘 매일 자바스크립트 개념에 대해서 공부 중인데, 이론만 공부하는 것이 생각보다 지루했다. 더군다나 코로나로 인해 대면 수업을 받지 못하는 상황이라 집에서 혼자 공부하려니 집중이 잘 되지 않았다.
그러다 코딩테스트를 접했는데 생각보다 재밌었다. html과 css는 바로바로 구현해가는 모습을 볼 수 있어서 매력있었는데 자바스크립트는 수학 문제를 푸는 느낌이라 색다른 즐거움을 느낄 수 있었다.
매일 하지 못하더라도 꾸준히 해보도록 하자!

profile
프론트엔드 개발자가 되기 위해 공부 중입니다.

0개의 댓글