JS 알고리즘 뽀개기 - 3

👉🏼 KIM·2023년 5월 28일
0

알고리즘

목록 보기
1/4

두 배열을 비교해서 false면 음수를 넣고, true면 양수를 넣어서 합을 구하는 내용인데 간단하면서도 오래걸린 문제이다.

이 문제 역시 filter나 reduce를 이용하면 간단하게 나올거 같은데 쉽지 않았다.
계속 어렵게 생각하면서 풀려고 하니 안풀리다가 반복문의 인덱스값으로 배열을 비교해보자. 라고 생각하여 for문을 돌려서 sign[i]이 false면 -를 붙여서 absolutes[i]에 넣어주었더니 입출력 예에 맞는 배열의 요소들이 나왔다.
[4,7,12]면 [4, -7, 12]가 되었다.
이렇게 나온 배열의 합을 구하면 끝나는 문제였다!

배열 요소의 합을 찾아보니 reduce가 나왔다.
reduce는 피해갈 수 없는 것 같아서 찾아보니 합을 구할때 예시가 많았다.
a+b 뒤에 0은 초기값인데, 따로 지정을 안해주면 1로 나온다고 한다. 0을 안써주면 1이 되기에 값이 +1이 되어 문제를 해결할 수 없었다. 초기값 중요!

function solution(absolutes, signs) {
    var answer = 123456789;
    
    for(let i=0;i<absolutes.length;i++) {
        if(signs[i] === false) {
            absolutes[i] = -absolutes[i]
        }
    }
    
    return answer = absolutes.reduce((a, b) => a + b, 0)
}

for문은 너무 단순하니 map이나 reduce로 바꿔보고 싶어서 map을 찾아보았다. for문 대신 map을 사용하면 다음과 같다.
(value와 index를 매개변수로 가지고 와서, index는 signs배열의 인덱스이고, value는 absolutes의 인덱스값으로 넣어 주어 나온 배열을 reduce를 돌려서 요소의 합을 구하는 코드 인것 같다.....)

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

문제를 다 풀고 다른 사람 문제 풀이를 보니 한줄도 있더라 ....

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

나도 이렇게 될 수 있을까..? 열심히 코드를 고치고 고쳐서 꼭 자바스크립트 알고리즘을 모두 뽀개버리겠다. 화이링 🙋🏼‍♀️

profile
프론트는 순항중 ¿¿

0개의 댓글