본문 바로가기
프로그래밍/JavaScript

[JS] Hosting 호이스팅이란? / 프로그래머스 구명보트 예시 문제 풀이

by hi-rachel 2023. 1. 27.

🌟 호이스팅(Hosting)이란?

[참고] JavaScript의 Hoisting인터프리터가 코드를 실행하기 전에 함수, 변수 또는 클래스의 선언을 해당 범위의 맨 위로 이동하는 것처럼 보이는 프로세스를 나타낸다.

 

호이스팅 : 코드에 선언된 변수 및 함수를 유효한 범위의 코드 상단으로 끌어올리는 작업
- var의 변수, 함수의 선언만 위로 올려지고, 할당은 올려지지 않는다.
- let, const 변수 선언과 함수 표현식에서는 호이스팅 발생 x

=> 위 내용만 알아도 된다.

 

호이스팅은 다른 방식에서 종종 var 선언의 특징 중 하나라고 여겨지지만, 아래와 같은 동작은 호이스팅으로 간주될 수 있다.

1. 변수가 선언되기 전에 해당 범위에서 변수의 값을 사용할 수 있다 ("값 호이스팅")

2. ReferenceError를 던지지 않고, 변수가 선언되기 전에 해당 범위에서 변수를 참조할 수 있지만, 값은 항상 undefined ("선언 호이스팅")

3. 변수를 선언하면 변수가 선언된 줄 앞에서 해당 범위의 동작이 변경된다.

 

+)

const x = 1;
{
  console.log(x); // ReferenceError
  const x = 2;
}

const x = 2; 선언이 전혀 호이스팅 되지 않는다면, console.log(x)는 상위 범위에서 값을 읽을 수 있어야 하지만 const x = 2; 선언이 정의된 전체 범위를 오염시켜 console.log(x) 명령문은 아직 초기화되지 않은 선언 x에서 값을 읽어 ReferenceError를 던진다. 하지만 이러한 선언의 호이스팅은 의미 있는 기능을 가져오지 않기 때문에 lexical declarations(let, const, class 선언)는 호이스팅하지 않는 것으로 특성화하는 것이 더 유용할 수 있다.

 

✏️ [프로그래머스] 구명보트 문제 풀이 예시

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

✏️ 문제 풀이

function solution(people, limit) {
    people.sort(function(a, b){return a-b});
    for(var i=0, j=people.length-1; i < j; j--) {
        if( people[i] + people[j] <= limit ) i++;
    }    
    return people.length-i;
}

for문이 끝났음에도 var 변수 선언 호이스팅으로 return에서도 사용 가능하다.

 

function solution(people, limit) {
   let sorted = people.sort((a,b) => a-b);
    let i, j = 0;
    for (i = 0, j = sorted.length-1; i < j; j--) {
        if (sorted[i] + sorted[j] <= limit) i++;
    }
    return sorted.length - i;
}

var을 쓰고 싶지 않다면 위에서 변수를 먼저 선언해 주면 for문에서도, 아래에서도 사용 가능하다.

 

구명보트 문제 풀이는 people을 몸무게 순으로 오름차순 정렬해 준 후, 첫 번째 값과 마지막 값(제일 몸무게 큰 사람)을 더해 limit을 넘지 않는 조합을 찾고, (찾지 못하면 마지막 값을 줄여가며, 가능한 조합을 찾으면 첫 번째 값을 올려가며) 다음 구조 가능 조합을 찾는다. (구명보트를 최대한 적게 사용하는 방법)

 

people 수에서 찾은 조합 i(= 찾은 2명 구명보트 조합)를 빼면 (구명보트를 못탄 사람들의 수 => 몸무게 제한된 한 명씩 구명보트를 타야 하므로(구명보트 수 = 사람 수)) + (가능한 2명 구명보트 수 => 2명씩 한 보트)이므로 필요한 구명보트 개수의 최솟값이 나온다.

 

 

 

🙂 공부하며 정리하는 글입니다. 잘못된 점이 있다면 피드백 남겨주세요.