Algorithm | 두 개 뽑아서 더하기

권기현·2021년 4월 1일
0

Algorithm

목록 보기
10/20

프로그래머스 Lv1

문제 설명

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

제한 사항

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

입출력 예

numbersresult
[2,1,3,4,1][2,3,4,5,6,7]
[2, 36, 1, 3][1, 2, 3, 36]
[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 해야 합니다.

📍 나의 풀이

function solution(numbers) {
    const answer = [];
    // 중복된 수를 제외한 합의 배열
    for (let i=0; i<numbers.length; i++){
        for (let j=0; j<numbers.length; j++){
            let num = numbers[i]+numbers[j]
            if(i !== j && answer.indexOf(num) < 0){
                answer.push(numbers[i]+numbers[j]);
            };
        };
    };

    // 삽입정렬 -> 오름차순 정리
    for(let n=1; n<answer.length; n++){
      let key = answer[n];
      let m = n-1;
      while( m >=0 && answer[m]>key){
        answer[m+1] = answer[m];
        m--;
      };
      answer[m+1] = key;
    }
    return answer;
};

사실 이 알고리즘을 올해 초에 풀었던 터라 왜 이렇게 복잡하고, 쓸데없는 코드를 써서 풀었는지 모르겠다. 아마 삽입정렬을 처음 보았던 때라서 한번 써보고 싶었었나보다.

조금 더 간단하게 바꿔보자.

📍 나의 풀이2

(삽입정렬 부분 -> sort()메소드로 바꿈.)

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

indexOf()메소드의 찾으려는 요소가 없을때, -1을 반환한다는 것을 이용하여 answer배열에 중복되는 값이 들어가는 것을 방지하였다.

- Array.indexOf()

: indexOf( ) 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환합니다.

구문

arr.indexOf ( searchElement [, fromIndex])

매개변수

  • searchElement: 검색요소
    배열에서 찾을 요소입니다.

  • fromIndex( Optional )
    검색을 시작할 색인입니다. 인덱스가 배열의 길이보다 크거나 같은 경우 -1이 반환되므로 배열이 검색되지 않습니다. 제공된 색인 값이 음수이면 배열 끝에서부터의 오프셋 값으로 사용됩니다. 참고 : 제공된 색인이 음수이면 배열은 여전히 앞에서 뒤로 검색됩니다. 계산 된 인덱스가 0보다 작 으면 전체 배열이 검색됩니다. 기본값 : 0 (전체 배열 검색).

반환 값
배열 내의 요소의 최초의 인덱스. 발견되지 않으면 -1.

설명
indexOf()는 엄격한 동등성 (=== 또는 triple-equals 연산자에서 사용하는 것과 같은 메서드)을 사용하여 검색 요소를 Array의 요소와 비교합니다.

문자열 또한 같은 메소드를 가지고 있고, 역할 또한 같다.
※ String.prototype.indexOf()

📍 다른 풀이

JS에 구현되어있는 Set자료구조를 사용하여 더 간단히 풀 수 있다.

- Set

:Set 객체는 자료형에 관계 없이 원시 값과 객체 참조 모두 유일한 값을 저장할 수 있습니다.

구문

new Set( [ iterable ] );

매개변수

  • iterable
    반복 가능한 객체가 전달된 경우, 그 요소는 모두 새로운 Set에 추가됩니다.
    만약 매개변수를 명시하지 않거나 null을 전달하면, 새로운 Set은 비어 있는 상태가 됩니다.

반환 값
새로운 Set 객체.

설명
Set 객체는 값 콜렉션으로, 삽입 순서대로 요소를 순회할 수 있습니다. 하나의 Set 내 값은 한 번만 나타날 수 있습니다. 즉, 어떤 값은 그 Set 콜렉션 내에서 유일합니다.

function solutionSet(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);
}

왜 spread Operator ( 전개 연산자 )??

[Javascript] Set 객체를 배열(Array)로 변환하는 3가지 방법

profile
함께 일하고 싶은 개발자를 목표로 매일을 노력하고, 옷을 좋아하는 권기현 입니다.

0개의 댓글