159일차 - 두 개 뽑아서 더하기(프로그래머스)

김민찬·2021년 10월 15일
0

취업으로의 여정

목록 보기
160/196

알고리즘에 대해 조금 소홀 했던 점이 있어서, 오늘은 프로그래머스 문제 하나를 정리하려고한다.

오늘 선택한 문제는 두 개 뽑아서 더하기이다.

for문과 조합 두 가지 방법으로 풀어보려고 한다.

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

입출력 예

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

for문을 사용한 풀이

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으로 대체하면 된다. 같은 방식으로 뽑고 싶은 정수의 숫자만큼 바꿀 수 있다.

profile
두려움 없이

0개의 댓글