JavaScript/알고리즘

프로그래머스 홀수vs짝수 JS (reduce() / map()을 통해서 바로 합구하기)

hihiha2 2023. 6. 15. 18:20
반응형

문제 설명

정수 리스트 num_list가 주어집니다. 가장 첫 번째 원소를 1번 원소라고 할 때, 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 return 하도록 solution 함수를 완성해주세요. 두 값이 같을 경우 그 값을 return합니다.

 

 

✅ 내 코드

function solution(num_list) {
    const even =[]
    const odd =[]
    
   num_list.map((num,i)=>i%2===0?odd.push(num):even.push(num))
   
    const evenSum = even.reduce((acc,cur)=>acc+cur)
    const oddSum =odd.reduce((acc,cur)=>acc+cur)
    
    return Math.max(evenSum,oddSum)
}

이 문제를 해결하기 위해서는 크게 3단계를 거쳐야한다고 생각했다.

1️⃣ 인덱스의 홀/짝을 구분해서 나눈다.

2️⃣ 각각의 합을 구한다

3️⃣ 합중에 어떤 값이 더 큰지 구한다.

 

우선, 인덱스의 홀짝을 구분해서 나누기 위해서 even과 odd라는 빈배열을 만들었다. (push할 배열!)

%연산자를 통해서 홀짝을 구분하고 push()로 even에는 짝수를, odd에는 홀수를 각각의 배열에 담아주었다.

map을 통해서 각각의 요소들을 돌면서 수행을 반복한다.

➡️ 이렇게하면 even = [짝수번째값들]만 담긴 배열이, odd = [홀수번째값들] 과 같이 홀수만 담긴 배열이 생긴다.

 

여기서 주의할 점은 배열의 인덱스는 0부터 시작하기 때문에 인덱스의 홀짝과는 반대로 생각해서 배열에 넣어야한다.

예를들면 배열의 두번째값의 인덱스는 이고 1로 나누었을때 나머지도 1이어서 배열odd에 push해야할 것 같지만,

이 문제에서는 배열의 첫번째를 홀수, 두번째를 짝수 이런식으로 분류하였기때문에 이 값을 even에 push하여야 한다.

 

 

그런 다음, reduce()를 통해서 각각의 합을 구한다.

바로 Math.max()안에 넣을수도 있겠지만 코드의 가독성을 위해서 const를 통해서 변수를 따로 만들어주었다.

짝수의 합은 evenSum에, 홀수의 합은 oddSum에 담긴다.

 

마지막으로, Math.max()를 이용해서 더 큰값을 구한다.

 

 

 

 

 

💻  다른사람 코드중에 배울 것

function solution(num_list) {
    let even = 0;
    let odd = 0

    num_list.map((v, idx) => {
        !(idx % 2) ? even += v : odd += v; 
    })

    return odd > even ? odd : even; 
}

기본적으로 map()과 인덱스의 값을 이용한다는 것은 같지만, reduce()를 쓰지않고 을 바로 map()안에서 해주었다.

기본적인 로직은 유사하나, 내 코드보다 훨씬 간결한 방법인 것 같아서 공부해보았다.

 

even과 sum을 배열이 아닌 숫자로 변수에 담기위해서, 초기값을 0으로 만든다.

이 변수들은 홀짝인덱스의 합을 저장할 용도로 사용된다. 

(내 코드는 홀짝은 먼저 나누고 합을 따로 해준것과 달리, 이 코드는 홀짝을 나누면서 합도 동시에 진행하기때문에 굳이 배열을 사용하지 않고 바로 0이라는 값을 초기값으로 사용했다)

 

map()을 통해 각각의 요소를 돌면서 %를 통해 인덱스의 홀짝을 구분하고 짝수일 경우 even에 해당 요소를 더한다. 아닌경우에는 odd에 더한다.

 

그런다음, odd와 even의 값을 비교하여 더 큰값이 리턴하도록 한다.

 

 

 

 

🙋‍♀️ 내생각

문제를 보자마자 합을 구하는 것이기 때문에 reduce()를 써야겠다고 생각했다.

map()을 통해서 값을 비교하면서 합도 구할 생각은 못했는데, 이렇게 코드를 짜는것이 오히려 가독성이 좋은것같아서 이 방법도 기억을 해둬야겠다. 

또한 합을 구한다고 해서 반드시 reduce()써야하는 것은 아니기때문에 문제를 풀면서 해당문제에는 어떤것을 사용하면 좋을지를 고려해서 코드를 짜야겠다.

 

 

반응형