코딩테스트

[JS] 월간 코드 챌린지 시즌2 > 음양 더하기

차차한 2022. 8. 12. 12:34

absolutes 배열은 절대값을 담고 있는 배열

signs 배열은 boolean을 담고 있는 배열인데 true는 +(양수)를, false는 -(음수)를 의미한다.

두 배열이 주어졌을 때 합을 구하기!

 

주의

1. absolutes와 signs의 배열 길이는 같다.

2. absolutes[i], signs[i]는 서로 짝이다. absolutes[0], signs[0]이 각각 3과 true면 +3을 의미한다. 

첫 번째 문제는 +4, -7, +12의 총합을 구해 9를 리턴함

function solution(absolutes, signs) {
    
    let answer = 0;
    for(let i = 0; i < signs.length; i++){
       let sign = signs[i] == true ? '+' : '-';
       let absol = absolutes[i];
       answer += Number(sign + absol);
    }  
    
    return answer;
}

원래 내가 푼 코드..

생각해보니 signs 배열의 값을 불리언이라 굳이 == true로 비교하지 말고

signs[i] ? '+' : '-' 이렇게만 적었어도 됐다.

뭐 전체적으로는 다 별로긴하지만 ㅠ

문제풀이 시간이 엄청 긴.... ㅠ 

function solution(absolutes, signs) {

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

다른 사람 풀이!

reduce라는 함수를 아예 알지 못 해서 코드 해석조차도 어려웠다.. 

reduce는 배열을 반복하면서 각 인덱스 값을 모두 더해 리턴을 해주는 함수다.

완전 이번 문제의 핵심 함수였다.

reduce 외에 map, filter, for Each등의 다양한 반복함수를 공부하고 다시 문제를 풀었다.

위의 코드를 해석하면 absolutes 배열을 reduce함수를 이용해 반복해 모든 값을 누적해서 리턴하겠다는 의미!

acc는 값이 누적되는 변수, val은 absolutes 배열의 인덱스 값(길이만큼 반복한다), i는 인덱스를 뜻한다.

화살표 함수로 표현되어 있는데 결국은

function reduce(acc, val, i){
	return acc + (signs[i] ? val : -val);
}

이 함수랑 동일한 의미다.

맨 뒤의 0은 acc의 시작값을 뜻한다!

배열의 길이만큼 반복하면서 signs[i]가 true면 absolutes[]의 값을 양수로 받고, false면 - 를 붙여 음수로 받는다.

그렇게 acc에 계속 더해주면 문제를 풀어낼 수 있다!~!

문제풀이 속도가 엄청나게 빨라졌다!

function solution(absolutes, signs) {

    let answer = 0;
    absolutes.forEach((v,i)=>{
        
        if(signs[i]){
            answer += v;
        }else{
            answer -= v;
        }   
    })
 
    return answer;  
}

forEach를 이용한 풀이 방법!

forEach도 배열의 길이만큼 계속 반복하는 점을 이용해 value와 index를 이용해 answer에 값을 추가한다.

여기서는 true일 때는 대입연산자 += 를 사용해 값을 더하고 false면 -=를 사용해서 값을 빼줬다..

진짜 다들 천재!