Algorithm | 두 개 뽑아서 더하기

권기현·2021년 2월 17일
0

Algorithm

목록 보기
3/20
post-thumbnail

프로그래머스 lv1

두 개 뽑아서 더하기

문제설명

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

제한조건

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

입출력 예

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

나의 풀이

function solution(numbers) {
    let 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;
};

정렬알고리즘을 공부하는 중 공부한 삽입정렬을 써볼 수 있는 예제였다. 아직 내가 짠 알고리즘의 성능, 메모리 사용량, 복잡도 등을 생각하며 알고리즘을 쓸 수 있는 단계는 아니지만, 나름 공부한 알고리즘을 사용해볼 수 있는 예제였다.
-> 물론...JS내장메소드를 사용해서 더 간단하게 작업할 수 있다...ㅜㅜ


다른 풀이 1

function solution(numbers) {
    let answer = [];
    for(let i=0; i < numbers.length; i++){
        for(let j=0; j<numbers.length; j++){
            if(i===j) continue; // 동일한 index는 skip
            answer.push(numbers[i]+numbers[j])
        }
    }
    answer = [...new Set(answer)].sort((a,b)=>a-b)
    return answer;
}

다른 풀이 2

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)
}

✅ Set

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

⇨ ES6가 등장하기 이전에는 자바스크립트 자체는 set을 구현하고 있지 않았습니다. 근데, set이 뭘까요?
Set은 데이터 타입 중의 하나인데, 중복되는 값을 가지지 않는 값들의 리스트입니다. 그리고 이 때 값은 순서가 존재하지 않죠.

new Set([iterable])

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

구성자(Constructor)

새로운 set을 만들때 new Set() 을 활용합니다. 이 때 구성자에 반복자(iterator)를 직접 작성할 수 있습니다.

const foo = new Set();
console.log(foo) // Set {}
//
const bar = new Set([ 1, 2, 3 ]);
console.log(bar) // Set { 1, 2, 3 }

⭐️ 그런데 set을 만들 때 중복되는 값을 가진 반복자를 넘기면, Set이 알아서 중복되는 값들 중 맨 앞의 값만 남기고 무시합니다.

const foo = new Set([ 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5 ]);
console.log(foo);
// Set { 1, 2, 3, 4, 5 }

✅ Set을 배열로 바꾸기 ( Set 활용 )

위에서 살펴봤듯이, 배열을 Set 으로 바꾸는 방법은 쉽습니다. Set 구성자에 배열을 넘기기만 하면 되었죠. 반대로 set을 배열로도 바꿀 수 있는데, 바로 전개 연산자(spread operator)를 활용하면 됩니다.

const foo = new Set([ 1, 2, 3 ]);
const fooInArray = [ ...foo ];
console.log(fooInArray) // [ 1, 2, 3 ];

✅ sort()

: sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다
⭐️ 즉, 이때, 원본 배열인 arr가 정렬이 되고, 리턴하는 값 또한 원본 배열인 arr을 가리키고 있다.

arr.sort([compareFunction])

  • 매개변수
    compareFunction | Optional
    정렬 순서를 정의하는 함수. 생략하면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬됩니다.

✅ sort() 함수로 숫자 오름차순 정렬하기

compareFunction는 a, b 두 개의 파라미터를 받고 두 숫자의 차가 양수값이냐, 음수값이냐를 이용하여 숫자를 오름차순으로 정렬할 수 있다.

function compareNumbers(a, b) {
  return a - b;
}

continue

⇨ break - 반복문에서 더 이상 반복문을 진행하지 않고 종료하고자 할 때 사용
⇨ continue - 반복문에서 현재 실행중인 반복문을 멈추고 다음 반복문으로 바로 진행할 때 사용

break 문과 달리 continue는 루프의 실행을 완전히 종료하지 않고 for, while문에서 다음과 같이 동작합니다.

  • while 루프에서는 다시 조건으로 점프합니다.
  • for 루프에서는 업데이트 표현식으로 점프합니다.

continue 문에는 현재 루프 대신 레이블이 지정된 루프 문의 다음 반복으로 건너 뛰도록하는 선택적 레이블이 포함될 수 있습니다. 이 경우, continue 문은 이 레이블 된 명령문 내에 중첩되어야합니다

이는 다른 포스팅에서 정리할 예정이다.

for (let count = 1; count < 6; count++){
    if (count == 3) 
        continue;
    console.log("count = " + count);
}
// 1 2 4 5

출처: https://devjhs.tistory.com/114 [키보드와 하루]

참고자료 | 자바스크립트 ES6 — Set에 대해 알아보자 🎉

참고자료 | 배열 정렬하기

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

0개의 댓글