본문 바로가기

Algorithm

5. 두 개 뽑아서 더하기 (LV.1)

이번엔 좀 오래걸렸다. 너무 어렵게 생각해서 문제 이해를 조합을 써야하는걸로 알았고, 덕분에 조합을 구현하는 알고리즘을 만들어보려고 한참 고생했다. 결국 실패.. 이 문제는 다른 사람의 풀이를 보았고 답을 본 순간 너무 허무했다. 중첩 for문을 쓰면 되는거였어 .. 😂

 

💫 내가 짜려했던 조합 알고리즘과 그 답 

 

const getCombinations = (array, selectNumber) => {
    const results = [];
    if(selectNumber === 1){
        return array.map((element) => [element]);
    }
    array.forEach((fixed, index, origin) => {
        const rest = origin.slice(index+1);
        const combinations = getCombinations(rest, selectNumber - 1);
        const attached = combinations.map((combination) => [fixed, ...combination]);
        results.push(...attached);
    });
    return results;
}
console.log(getCombinations([1,2,3,4], 3));

 

 

매커니즘은 위와 같다.

 

이해하는데 이틀은 걸린 것 같다. 다음에 잘 써먹어야겠어. 

 

💫 두 개 뽑아서 더하기 풀이 

 

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

 

✅ 문제에서 주어진 조건인 '서로 다른 인덱스' 는 두 가지 방식을 이용해 해결할 수 있다. 

 

1. 

 

for (let i = 0; i < numbers.length; i++) {
        for (let j = i + 1; j < numbers.length; j++) {
            temp.push(numbers[i] + numbers[j])
        }
    }

 

이 것처럼 중첩 for 문 속 j를 i보다 항상 더 많게 하여 안겹치게 하는 것.

 

2.

 

 for(let i = 0; i < numbers.length; ++i){
        let sum = 0;
        for(let j = 0; j < numbers.length; ++j){
            if(i != j){
                set.add(numbers[i] + numbers[j]);
            }
        }
    }

 

이 것처럼 i와 j 가 다를 경우에만 실행되게 하는 것. 

 

✅ set 메소드에 대해서도 새롭게 알았는데 그건 다른 글에 정리해놓았다.

 


💫 reference 

 

https://nyang-in.tistory.com/212

'Algorithm' 카테고리의 다른 글

7. 평균 구하기  (0) 2021.09.12
6. 자리 수 더하기 (LV.1)  (0) 2021.09.11
4. 서울에서 김서방 찾기 (LV.1)  (0) 2021.09.03
3. 핸드폰 번호 가리기 (LV.1)  (0) 2021.08.31
2. 이상한 글자 만들기 (LV.1)  (0) 2021.08.29