티스토리 뷰

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

 

코딩테스트 연습 - 내적

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요. 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의

programmers.co.kr

해결방법

1. a의 i번째와 b의 i번째를 곱한 값을 누적하여 더한다

 

 

풀이 1

function solution(a, b) {
    var answer = 0;

    for (let i = 0; i < a.length; i++){
        answer += a[i] * b[i]
    }
    return answer;
}

가장 먼저 떠오른 방법은 for문으로 누적 합을 구하는 방법이다

 

풀이 2

function solution(a, b) {
    return a.reduce((acc, val, i) => acc += val * b[i], 0);
}

배열 요소들의 누적 합을 구할 때 자주 쓰이는 reduce도 이용해보았다

 

 

배운 점

1. var solution

또 다른 풀이를 알아보다가 변수 함수 선언과 화살표 함수를 사용한 코드를 발견했다

var solution = (a, b) => a.reduce((acc, val, i) => acc += val * b[i], 0);

나한테는 함수 선언 방식이 익숙하다보니 함수 표현식은 잘 사용하지 않게 된다

 

 

복습 겸 함수 표현식과 함수 선언 방식의 차이를 다시 공부해보자

다음 코드에서 함수 표현식인 solution1에서는 solution1()이 오류가 나지만

함수 선언 방식인 solution2에서는 solution2()를 했을 때 yuni가 정상적으로 출력된다

solution1(); 
var solution1 = solution() {
    console.log("yuni");
}


solution2();
function solution2() {
    console.log("yuni");
}

그 이유는?

바로 호이스팅(Hoisting) 때문이다

자바스크립트는 인터프리터 방식 언어라 위에서부터 아래로 순차적으로 코드가 실행된다

순차적으로 실행되기에 현재 실행되는 코드의 밑에 있는 내용을 모르는 것이다

그래서 하단에 함수가 정의된 경우 위 코드에서 함수를 호출하는 것이 불가능하다

이를 위해 자바스크립트는 전체 코드에서 변수 및 함수 정의 코드를 맨 위로 끌어올려 선언하는 작업을 먼저하고

코드를 순차적으로 실행한다

이렇게 변수 및 함수의 정의를 맨 위로 끌어올리는 과정을 호이스팅이라고 한다

호이스팅으로 인해 자바스크립트는 변수 및 함수가 정의된 위치에 상관없이 변수나 함수를 어느 위치에서든 사용할 수 있다

함수 표현식은 변수만 호이스팅이 되기 때문에 하프 호이스팅(Half Hoisting) 이라고도 한다

따라서 함수 표현식은 반드시 함수를 선언한 뒤에 호출해야 한다

댓글