ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.11.30 // Programmers_음양 더하기
    AIL( Algorithm I Learned) 2023. 11. 30. 09:59

    ## AIL_ 음양 더하기

    ***문제 설명
    어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

    ***제한사항
    #1_absolutes의 길이는 1 이상 1,000 이하입니다.absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
    #2_signs의 길이는 absolutes의 길이와 같습니다.signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

    ***입출력 예
    absolutes signs result
    [4, 7, 12] [true, false, true] 9
    [1, 2, 3] [false, false, true] 0

    ***입출력 예 설명
    입출력 예 #1_signs가 [true,false,true] 이므로, 실제 수들의 값은 각각 4, -7, 12입니다.따라서 세 수의 합인 9를 return 해야 합니다.
    입출력 예 #2_signs가 [false,false,true] 이므로, 실제 수들의 값은 각각 -1, -2, 3입니다.따라서 세 수의 합인 0을 return 해야 합니다.

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 `absolutes` 배열과 `signs` 배열이 주어집니다. `absolutes` 배열은 정수들의 절댓값을 담은 배열이며, `signs` 배열은 각 정수들의 부호를 나타내는 불리언(참 또는 거짓) 값을 담은 배열입니다.

     

    1) absolutes 배열의 각 요소를 순회하면서 해당 요소의 부호를 signs 배열의 값에 따라 결정합니다.

     

    2) signs 배열의 값이 true이면 해당 absolutes 배열의 요소는 양수입니다. false이면 해당 요소는 음수입니다.

     

    3) 각 요소의 부호에 따라 해당 값을 더하거나 빼서 최종적으로 정수들의 합을 구합니다.

     

    이때, 주의할 점은 signs 배열의 값이 true이면 해당 absolutes 배열의 요소를 더하고, false이면 해당 요소를 뺀다는 것입니다. 이 점을 고려하여 각 요소를 더하거나 빼서 최종 결과 값을 구하면 됩니다.


    2. 문제풀이

    function solution(absolutes, signs) {
        var answer = 0; 
        
        for (let i = 0; i < absolutes.length; i++) {
            if (signs[i]) { // 만약 signs 배열의 i번째 요소가 참(true)이면
                answer += absolutes[i]; // 현재 i번째 absolutes의 값을 더합니다.
            } else { // 만약 signs 배열의 i번째 요소가 거짓(false)이면
                answer -= absolutes[i]; // 현재 i번째 absolutes의 값을 빼줍니다.
            }
        }
        
        return answer; 
    }
    /*
    테스트 1
    입력값 〉	[4, 7, 12], [true, false, true]
    기댓값 〉	9
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	[1, 2, 3], [false, false, true]
    기댓값 〉	0
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1) `var answer = 0`; 변수를 선언하고 0으로 초기화합니다. 이 변수는 최종 결과 값을 저장할 변수입니다.

     

    2) `for (let i = 0; i < absolutes.length; i++) { ... }`  `absolutes` 배열을 순회하는 반복문을 시작합니다.

     

    3) `if (signs[i]) { ... } else { ... }` ` signs` 배열의 i번째 요소가 참(true)인 경우와 거짓(false)인 경우를 처리합니다.

     

    4) `signs[i]`가 참인 경우(true): `absolutes[i]` 값을 `answer`에 더합니다.

     

    5) `signs[i]`가 거짓인 경우(false): `absolutes[i]` 값을 `answer`에서 빼줍니다.

     

    6) `return answer;` 반복문이 종료되면 최종 결과 값을 반환합니다.


    3. 다른사람의 문제풀이 및 접근방식 분석

    function solution(absolutes, signs) {
        // 배열의 reduce 메서드를 활용하여 각 요소를 순회하면서 값을 누적합니다.
        // acc: 누적값, val: 현재 요소의 값, i: 현재 인덱스
        return absolutes.reduce((acc, val, i) => {
            // signs 배열의 i번째 요소가 참(true)이면 해당 요소는 양수이므로 val 그대로 더합니다.
            // signs 배열의 i번째 요소가 거짓(false)이면 해당 요소는 음수이므로 val에 -1을 곱해서 뺍니다.
            return acc + (val * (signs[i] ? 1 : -1));
        }, 0); // 초기 누적값을 0으로 설정합니다.
    }
    
    /*
    테스트 1
    입력값 〉	[4, 7, 12], [true, false, true]
    기댓값 〉	9
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	[1, 2, 3], [false, false, true]
    기댓값 〉	0
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    해당 함수는 reduce 메서드를 사용하여 배열의 각 요소를 순회하면서 값을 누적합니다. 여기서 각 요소는 `val`로 나타내며, 누적값은 `acc`로 표현됩니다. `i`는 현재 요소의 인덱스를 나타냅니다.

     

    1. `reduce` 메서드를 사용하여 `absolutes` 배열의 각 요소를 순회하고, 초기값을 0으로 설정합니다.

     

    2. 각 요소를 순회하며, `signs[i]`가 `true`인 경우는 해당 `val` 값을 그대로 더하고, `false`인 경우는 해당 `val`값을 음수로 처리하여 더합니다.

     

    3. 최종적으로 누적된 값을 반환합니다.


    #  reduece 함수 사용시 주의사항

    1.  초기값 설정

    reduce 메서드를 사용할 때 초기값을 설정해야 합니다. 초기값이 주어지지 않으면 첫 번째 요소가 초기값이 되며, 순회가 첫 요소부터 시작합니다. 초기값을 명시하는 것이 코드의 의도를 명확히 하고 예상치 못한 오류를 방지할 수 있습니다.

    2. 콜백 함수의 매개변수

     reduce의 콜백 함수는 다음과 같이 작동합니다: (누적값, 현재 요소, 현재 인덱스, 배열) => { ... }. 각 매개변수의 역할을 이해하고 사용하는 것이 중요합니다.

    3. 누적값의 타입

     reduce 함수에서 반환되는 값의 타입은 초기값과 누적되는 요소의 계산에 따라 결정됩니다. 이를 고려하여 누적값의 타입이 올바른지 확인해야 합니다.

    4. 콜백 함수 내의 연산

     콜백 함수 내에서 수행하는 연산이나 로직은 코드의 명확성과 오류 방지를 위해 신중하게 검토합니다.

    5. 부수 효과를 피하기

    reduce 함수 내부에서 상태를 변경하는 부수 효과를 발생시키는 작업은 지양해야 합니다. 이는 함수의 예측 불가능한 동작을 유발할 수 있습니다.

Designed by Tistory.