알고리즘에 대해 조금 소홀 했던 점이 있어서, 오늘은 프로그래머스 문제 하나를 정리하려고한다.
오늘 선택한 문제는 두 개 뽑아서 더하기이다.
for문과 조합 두 가지 방법으로 풀어보려고 한다.
문제: 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
numbers | result |
---|---|
[2, 1, 3, 4, 1] | [2, 3, 4, 5, 6, 7] |
[5, 0, 2, 7] | [2, 5, 6, 9, 12] |
function solution(numbers) {
let result = [];
// 두 정수의 합을 담을 배열을 생성
for (let i = 0; i < numbers.length-1; i++) {
// 두 정수를 뽑아야 함으로 첫 번째 뽑을 정수는 마지막 정수 하나 전까지만 찾는다.
for (let n = i+1; n < numbers.length; n++) {
// 두 번째 정수는 첫 정수는 앞의 정수 보다 다음 정수에서 찾는다.
result.push(numbers[i] + numbers[n]);
// 두 정수의 합을 처음 생성한 배열에 넣어준다.
};
};
result = [...new Set(result)];
// 중복을 제거한다.
return result.sort((a, b) => (a-b));
// 오름차 순으로 정렬한다.
}
function solution(numbers) {
let result = [];
function pickOrNot(arr, bucket, n) {
if (n === 0) {
result.push(bucket);
return;
};
for (let i = 0; i < arr.length; i++) {
const sliceArr = arr.slice(i+1);
pickOrNot(sliceArr, bucket+arr[i], n-1);
};
}
pickOrNot(numbers, 0, 2);
result = [...new Set(result)];
return result.sort((a, b) => (a-b));
}
for문을 사용한 풀이는 숫자 하나를 더 뽑고 싶으면 for문을 한개를 추가해서 식을 고쳐야 한다.
조합을 사용한 풀이는 약간 더 복잡하지만, 재사용 가능성이 있는 장점이 있다.
만약 2개의 정수를 뽑고 싶은 것이 아니라 3개의 정수를 뽑고 싶으면 pickOrNot(numbers, 0, 2)
대신 pickOrNot(numbers, 0, 3
으로 대체하면 된다. 같은 방식으로 뽑고 싶은 정수의 숫자만큼 바꿀 수 있다.