본문 바로가기
알고리즘

[프로그래머스 / 코딩테스트 연습] 두 개 뽑아서 더하기-자바스크립트(javascript)

by 지 요니 2023. 4. 12.
🎪 문제 설명

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

 

🎪 나의 문제 풀이
  • 처음 문제풀이
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((a,b)=>a-b);
  return answer;
}

1) 배열의 두 수 뽑아 더하기

numbers의 각 요소에 접근해야 하므로 0번 인덱스부터  numbers의 길이만큼 도는 i와 나머지 한 수의 인덱스를 겹치지 않게 뽑으려면 j를 i+1에서 부터 numbers의 길이까지 반복하는 이중 for문을 이용하여 더한 값을 sum에 담아 주었다.

2) 중복된 값 제거

이렇게 구한 값들에서 중복된 숫자를 제거해주자. 

특정 문자의 위치를 찾는 indexOf()메서드를 이용하여 배열에 sum과 같은 값이 없으면 answer배열에 담아주었다.

3) 오름차순 정렬

숫자를 오름차순으로 정렬하는 것이므로 a-b로 크기를 비교하는 함수를 사용해 정렬해주었다.

 

🎪 다른 문제 풀이

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

내가 푼 방법은 이중포문을 돌린 후에 중복된 값을 뺀 채로 배열에 넣는 순으로 구현하였는데, 

먼저 두 수를 뽑아 더해준 모든 값을 temp에 담은 후에 set을 쓰면 자동적으로 중복된 값이 제거되니까 더 간편한 것 같다. map, set에 대해 이해는 가는데 막상 문제 풀 때는 생각이 잘 안난다.. 😂

 

🎨 set() 메서드
  • set객체는 중복되지 않은 유일한 값들의 집합 => 수학적 집합을 구현하기 위한 자료구조
  • set 객체의 특징
    • 동일한 값을 중복하여 포함할 수 없다
    • 요소 순서에 의미 없다
    • 인덱스를 요소에 접근 불가
  • set객체 생성
    • set객체는 set의 생성자 함수로 생성
    • 인수를 전달히자 않을 경우 빈 set 객체 생성
    • set 생성자 함수는 이터러블을 인수로 받아 set객체 생성
const set = new Set();
console.log(set); // Set(0) {}

const set1 = new Set([1, 2, 3, 3]);
console.log(set1); // Set(3) {1, 2, 3}
  • set객체는 이터러블이기 때문에 for ..of 문으로 순회가능하고, 스프레드 문법, 배열 디스트럭처링의 대상이 될 수 있다
const set = new Set([1, 2, 3]);

// Set 객체는 Set.prototype의 Symbol.iterator 메서드를 상속받는 이터러블이다.
console.log(Symbol.iterator in set); // true

// 이터러블인 Set 객체는 for...of 문으로 순회할 수 있다.
for (const value of set) {
  console.log(value); // 1 2 3
}

// 이터러블인 Set 객체는 스프레드 문법의 대상이 될 수 있다.
console.log([...set]); // [1, 2, 3]

// 이터러블인 Set 객체는 배열 디스트럭처링 할당의 대상이 될 수 있다.
const [a, ...rest] = [...set];
console.log(a, rest); // 1, [2, 3]

댓글