본문 바로가기

2.알고리즘/프로그래머스

[JS]음양 더하기

https://school.programmers.co.kr/learn/courses/30/lessons/76501

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

제출코드

function solution(absolutes, signs) {
    return absolutes.reduce((acc, cur, i) => {
        signs[i] ? acc =  acc + cur : acc =  acc - cur
        return acc;
    },0)
}

 

 

문제의 조건을 보았을때, 순회해야하는 배열은 2개이나 길이가 같다고 하였습니다

 

한개만 순회하면, 나머지는 인덱스로 접근하면 된다는 아이디어를 내었습니다. 

 

코드가 쉬울것이라고 생각해서 최대한 짧게 구현하려고 노력하였습니다.

 

 


//1번 풀이
function solution(absolutes, signs) {
    let sum = 0;
    absolutes.forEach((e, i) => {
        if (signs[i]) {
            sum += e
        } else {
            sum -= e
        }
    })
    return sum
}

최초 풀이는 다음과 같습니다. absolutes를 순회하되, 길이가 같으므로 signs의 index로 접근을 하고, 

signs의 "값"은 Boolean이기에 분기로 누적하거나 감산하였습니다.

 

이렇게 해야하나 생각이 들면서 reduce의 가산기 기능을 이용하면 쉬울 것이라 판단하였습니다.

//2번 풀이
function solution(absolutes, signs) {
    return absolutes.reduce((acc, cur, i) => {
        if (signs[i]) {
            acc =  acc + cur
        } else {
            acc =  acc - cur
        }
        return acc;
    },0)
}

여기서 분기만, 삼항조건연산자로 변경하여 최종 제출 코드가 되었습니다.

//최종 제출코드
function solution(absolutes, signs) {
    return absolutes.reduce((acc, cur, i) => {
        signs[i] ? acc =  acc + cur : acc =  acc - cur
        return acc;
    },0)
}

 

 


아쉬운 점은

array.filter(Boolean)

이 코드를 사용하면 signs의 배열을 true / false로 분기하여 absolutes를 더하고 싶었는데, 구현에 실패하였고

목표?

제가 구현하고 싶었던 내용과 가장 비슷한게 위의 코드였던 것 같습니다. filter로 하려고 어려웠는데 수학적 지식을 이용했다면 가능했을 것 같습니다.

 

 

 

음수와 양수를 *1 또는 -1로 표현할 수 있다는 수학적인 지식을 코드에 구현하지 못했습니다.

 

짧다고 좋은 코드는 아니나, 양식 자체를 변경하여, 함수 선언문 말고 화살표 함수를 사용했으면 한줄로도 표현했을 수 있었습니다.

 

 


능동적으로 문제를 변경하고, 수학적 지식이 필요하다는게 포인트였던 문제 였습니다.

반응형