Javascript에서 false로 간주되는 값들 (falsy)

프로그래머스 대충만든 자판 문제를 풀이하다가 NaN과 논리연산에 의문이 생겨 조금 더 알아보았다!

 

우선 프로그래머스 문제의 조건은 다음과 같다.

1) 자판에 문자가 1개 이상 할당될 수 있고, 두번째에 할당되어있는 문자를 입력하려면 해당 자판을 두번 누르면 된다.

2) 문자열 배열이 주어졌을 때 그 문자들을 자판으로 입력하기위해 필요한 '자판을 누르는 최소 수'를 구한다.

 

내가 접근한 방법

1) 자판으로 입력할 수 있는 문자들을 객체의 키로 만들고, 여러 자판을 눌렀을 때 그 문자가 나오는 가장 작은 수를 구해둔다.

-> 매번 가장 작은 수를 구하지 않고 저장해뒀다가 활용하기 위함

2) 문자열 배열을 돌며 각 문자를 입력하기 위해 필요한 수를 객체에서 찾아 더한다.

 

궁금했던 부분

function solution(keymap, targets) {
    let minTap = {};
    
    // 각 단어가 등장하는 가장 빠른 순서 구하기
    for(let key of keymap) {
        key.split("").forEach((char, idx) => {
           minTap[char] = Math.min(minTap[char], idx + 1);
        });
    }
    
    (생략)
}

 

 

처음엔 자판들을 반복하며 더 작은 값으로 객체의 값을 갱신해줘야하니 큰 고민없이 Math.min을 사용했다.

값이 잘 들어갔는지 확인하기위해 minTap을 출력해보니 모든 키의 값들이 NaN으로 출력됐다.

 

결론적으론 존재하지 않는 값(undefined)를 숫자(idx + 1)와 비교하려하니 NaN이 반환된 것이다.

(NaN: 부정확하거나 정확하지 않은 수학 연산으로 오류가 발생했을 때 반환되는 값)

 

저 방법을 사용하려면 minTap에 모든 알파벳과 Infinity를 key-value로 초기화시켜둔 후 사용할 수 있었겠지만, 지금 문제에서는 어떤 알파벳이 입력 불가한가 까지는 꼭 저장해두지 않아도 된다고 생각이 들어서 다른 방법을 고민해보았다.

 

function solution(keymap, targets) {
    var answer = [];
    let minTap = {};
    
    // 각 단어가 등장하는 가장 빠른 순서 구하기
    for(let key of keymap) {
        key.split("").forEach((char, idx) => {
           minTap[char] = minTap[char] < idx + 1 ? minTap[char] : idx + 1;
        });
    }
    
    (생략)
}

 

존재하지 않는 값(undefined)과 idx + 1을 비교하니 false가 나왔다. 그래서 이를 활용해 삼항연산자로 minTap을 갱신했다.

 

 

출력해보니 값도 원하는 방식으로 잘 들어가있었다.

존재하지 않는 값과 숫자를 비교한 건 마찬가지인 것 같은데 왜 이런 차이가 발생할까?

이는 undefined < Number 의 결과 NaN을 false로 간주하기 때문이다.

이를 활용해 아직 키가 존재하지 않는 문자인 경우, 키가 존재하지만 다른 자판을 입력했을 때 더 적게 누르는 경우 새로운 인덱스 + 1 로 갱신하고, 기존의 값이 더 작은 경우는 기존 값을 그대로 유지하는 것이 가능한 것이었다!

 

활용을 잘 하려면 기본을 잘 알고있어야한다는 것을 또한번 느꼈다..

 

Javascript에서 거짓으로 간주하는 값들

boolean 문맥에서 false로 간주되는 값을 의미하며, falsy라고도 불린다.

 

종류

1) null

2) undefined

3) NaN

4) false

5) 0, -0 (진법, 실수 상관없이 0을 의미하는 값)

6) "" (비어있는 문자열)

7) document.all

 

 

참고자료

MDN, 거짓같은 값

 

거짓 같은 값 - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN

거짓 같은 값(Falsy, falsey로 쓰이기도 함) 값은 Boolean 문맥에서 false로 평가되는 값입니다.

developer.mozilla.org