[LeetCode | Javascript] Ransom Note

박기영·2023년 8월 31일

LeetCode

목록 보기
24/41

solution 1

/**
 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
var canConstruct = function(ransomNote, magazine) {
    // magazine에 있는 문자열을 key, 개수를 value로 관리하고
    // ransomNote를 순회하면서 하나씩 감소시키는건?
    // 일치하는게 없으면 false
    // 전부 통과하면 true

    let hashMap = {};

    for(let i = 0; i < magazine.length; i++){
        if(hashMap[magazine[i]] === undefined){
            hashMap[magazine[i]] = 1;
        } else {
            hashMap[magazine[i]]++;
        }
    }

    for(let i = 0; i < ransomNote.length; i++){
        if(hashMap[ransomNote[i]]){
            hashMap[ransomNote[i]]--;
            continue;
        }

        return false;
    }

    return true;
};

magazine에 있는 각각의 문자열이 한번씩만 쓰일 수 있다는 점을 이용하여 문제를 해결했다.
문자열을 key로, 사용할 수 있는 횟수를 value로 설정하여 hashMap에 저장하고,
ransomNote를 순회하면서, ransomNote의 문자열과 hashMapkey가 일치하면
value를 1씩 차감하는 방식이다.
만약 일치하는 key가 없다면 magazine에 있는 문자열로는 ransomNote를 만들 수 없으므로 false
모든 문자열이 일치한다면 true가 된다.

hashMap[ransomNote[i]]hashMap에 들어있는 keyvalue가 0일 때 false인데,
더 이상 사용할 수 없는 문자열을 사용하려고 하는 경우에 해당하므로 false가 반환된다.

solution 2

/**
 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
var canConstruct = function(ransomNote, magazine) {
    let hashMap = new Map();

    for(let i = 0; i < magazine.length; i++){
        if(!hashMap.has(magazine[i])){
            hashMap.set(magazine[i], 1);
        } else {
            hashMap.set(magazine[i], hashMap.get(magazine[i]) + 1);
        }
    }

    for(let i = 0; i < ransomNote.length; i++){
        if(hashMap.has(ransomNote[i]) && hashMap.get(ransomNote[i]) !== 0){
            hashMap.set(ransomNote[i], hashMap.get(ransomNote[i]) - 1);
            continue;
        }

        return false;
    }

    return true;
};

이전 풀이에서는 일반 객체를 hash map으로 사용했었는데, 이번에는 Map 객체를 사용해봤다.
똑같은 로직으로 흘러가긴 하는데, 주의할 점이 있다.
Map 객체는 has()를 통해서 특정 key가 존재하는지를 따진다.
문제는, 0value로 가지고 있다고 해도, key는 존재하므로 true를 반환한다는 것이다.
일반 객체를 사용할 때는 0이라는 값이 falsy했기 때문에 로직에 문제가 없었지만,
여기서는 문제가 된다는 것이다!
따라서, 0인지 아닌지까지도 따지는 조건을 추가해줘야한다.
0이라면 더이상 사용할 수 없는 문자열이니 말이다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글