본문 바로가기
Developer/Algorithm

Programmers 월간 코드 챌린지 시즌1 - 두 개 뽑아서 더하기 (JavaScript)

by 김씩씩 2020. 9. 17.

Programmers 월간 코드 챌린지 시즌1 - 두 개 뽑아서 더하기 (JavaScript)

 

Programmers(프로그래머스)의 코딩테스트 연습문제 Level 1 중 월간 코드 챌린지 시즌1 문제인 두 개 뽑아서 더하기 문제를 JavaScript를 사용하여 문제를 풀어보도록 하겠습니다.

 

 

문제 설명

정수 배열 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 해야 합니다.

 

작성한 답

solution.js

function solution(numbers) {
    return [...new Set(numbers.reduce((ac,v,i,ar)=>[...ac,...ar.slice(i+1).map(v_=>v_+v)],[]))].sort((a,b)=>a-b);
}

 

설명

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

입출력 예 설명을 보시면 바로 해결방법은 떠오르는 문제입니다.

아마 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 배열에 담는 부분을 많은 분들이 반복문 for문을 사용하여 해결하셨으리라 생각됩니다.

 

저는 그보다 reduce와 map 을 사용하는 것이 코드를 깔끔하게 볼 수 있고 사용하기도 좋다고 생각하여 코드를 작성해 보았습니다.

reduce를 사용해 배열을 하나 초기화 하고, 배열에 기존 numbers 배열을 나타내는 인수인 ar에 현재 가리키고 있는 값의 뒷부분들을 slice(i+1)로 잘라 배열을 만들고 해당 배열을 map을 사용하여 현재 가리키고 있던 값을 모든 요소에 더해준 뒤 reduce에 더해주는 배열에 추가해줍니다.

그렇게 for문을 두번 돌려야 나오는 결과를 손 쉽게 구해준 뒤 [...new Set()]으로 요소가 중복되지 않은 unique 한 배열을 만들어내고,

sort((a,b)=>a-b)로 하여금 수의 크기를 비교해서 오름차순으로 정렬해줍니다.

그냥 sort()를 사용하면 숫자 자체의 크기가 아닌 사전순으로 정렬되니 주의해주시기 바랍니다.

입출력 예로 들자면 [2, 5, 7, 9, 12] 로 정렬되어야 할 배열이 [12, 2, 5, 7 ,9]로 정렬되어 나옵니다.

 

 

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청 사항은 언제든지 말씀 해주세요!

 

감사합니다.


댓글