코딩 테스트 연습/Programmers

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

은돌1113 2023. 8. 16. 09:57

문제 설명

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

입출력 예 설명


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

문제풀이

  • 나의 풀이
    • 2중 for문을 사용해서 index가 같지 않으면서 합이 중복되지 않는 경우에만 answer에 push 하고 sort()를 사용하여 결괏값을 오름차순으로 정렬되어 반환되도록 코드를 구현하였다.
function solution(numbers) {
  var answer = [];

  for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
      const num1 = numbers[i];
      const num2 = numbers[j];

      // index가 같지 않으면서 (서로 다른 값을 더하기 위해서) answer에 값이 없는 경우(중복되지 않는 경우) answer에 num1과 num2의 합을 push한다.
      if (i !== j && !answer.includes(num1 + num2)) {
        answer.push(num1 + num2);
      }
    }
  }

  // 오름차순으로 정렬
  answer = answer.sort((a, b) => (a > b ? 1 : -1));

  return answer;
}
// map()이나 filter() 같은 배열 연산자는 numbers의 길이만큼만 연산을 진행하기 때문에 사용하지 못하고, 대신 2중 for문을 사용하였다.

solution([2, 1, 3, 4, 1]);
solution([5, 0, 2, 7]);
  • 다른 분의 풀이
    • "나의 풀이"와 다른 점은 new Set()을 사용했다는 점과, sort()에서 a > b ? 1 : -1이 아닌 a - b를 사용하였다는 점인데
    • 여기서 Set()은 자바스크립트의 고유한 값들의 집합을 다루는 자료 구조로써 이를 활용하면 데이터 중복을 제거하고 유일한 값들을 효과적으로 관리할 수 있다고 한다.
      • 문자, 숫자 등의 데이터 타입은 중복 제거가 되는 데 객체(Object)는 중복 제거가 안되는 것으로 확인됨
    • 아래 풀이를 통해서 숫자 배열을 정렬할 때 a > b : 1 - 1 대신 a -b로 코드를 간결하게 바꿀 수 있다는 걸 알게 되었다.
function solution(numbers) {
  var answer = [];

  for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
      const num1 = numbers[i];
      const num2 = numbers[j];

      // index가 같지 않으면서 answer에 num1과 num2의 합을 push한다.
      if (i !== j) {
        answer.push(num1 + num2);
      }
    }
  }

  // new Set()을 사용하여 중복된 값 제거 && .sort((a, b) => a - b)를 사용하여 오름차순으로 정렬
  answer = [...new Set(answer)].sort((a, b) => a - b);

  return answer;
}
// map()이나 filter() 같은 배열 연산자는 numbers의 길이만큼만 연산을 진행하기 때문에 사용하지 못하고, 대신 2중 for문을 사용하였다.

solution([2, 1, 3, 4, 1]);
solution([5, 0, 2, 7]);

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr