JS-algorithm/프로그래머스

[프로그래머스] 음양 더하기 (javascript)

yunieyunie 2022. 5. 23. 15:57

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

 

코딩테스트 연습 - 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 re

programmers.co.kr

 

해결 방법

1. signs의 i번째가 true면 absolutes의 i번째 요소를 answer에 누적하여 더하고 false면 -1을 곱한 후 더한다

 

 

풀이 1

function solution(absolutes, signs) {
    var answer = 0;
    
    for (let i = 0; i < signs.length; i++){
        if (signs[i] === true){
            answer += absolutes[i];
        } else{
            answer += absolutes[i] * -1;
        }
        
    }
    return answer;
}

 

풀이 2

function solution(absolutes, signs) {
    var answer = 0;
    
    for (let i = 0; i < signs.length; i++){
        signs[i] ? answer += absolutes[i] : answer += absolutes[i] * -1
    }
    
    return answer;
}

 

 

배운 점

1. reduce와 삼항 연산자를 애용하자

reduce와 삼항 연산자가 알고리즘 풀이에서 자주 사용되는 것을 느꼈다

특히 배열에서 요소들의 합과 같은 연산을 할 때 for문 대신 reduce를 사용하고

if문 대신 삼항 연산자를 사용하면 코드가 더욱 간결해지는 것 같다

 

reduce와 삼항 연산자를 사용하면 다음과 같이 한 줄로 표현할 수 있다 

function solution(absolutes, signs) {

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

reduce와 삼항 연산자 사용이 익숙해지도록 노력해야겠다

 

 

2. forEach

배열의 요소 각각을 한 번씩 실행하는 forEach를 사용한 풀이를 발견했다

참고 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

 

Array.prototype.forEach() - JavaScript | MDN

forEach() 메서드는 주어진 함수를 배열 요소 각각에 대해 실행합니다.

developer.mozilla.org

문법은 다음과 같다

forEach((현재 요소, 현재 요소의 인덱스, 순회 중인 배열) => 실행문)

현재 요소의 인덱스와 순회 중인 배열은 생략 가능하다

 

아래는 for문과 비교한 것이다 

const items = ['item1', 'item2', 'item3'];
const copy = [];

// for
for (let i=0; i<items.length; i++) {
  copy.push(items[i]);
}

// forEach
items.forEach(function(item){
  copy.push(item);
});

매번 for문만 사용해왔는데 이젠 forEach도 머릿 속에 넣어야겠다

 

forEach를 사용한 풀이는 다음과 같다

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