Ransom Note

zoovely·2024년 5월 24일
0
post-thumbnail

💬 문제

[문제 링크]

두 개의 문자열 ransomNote, magazine
magazine의 문자들로 ransomNote를 만들 수 있으면 true
못 만들면 false 반환

✍️ 나의 풀이

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

    for (let i = 0; i < magazine.length; i++)
        char.set(magazine[i], char.has(magazine[i]) ? char.get(magazine[i]) + 1 : 1);

    for (let j = 0; j < ransomNote.length; j++) {
        if (char.has(ransomNote[j])) {
            if (char.get(ransomNote[j]) === 1)
                char.delete(ransomNote[j]);
            else
                char.set(ransomNote[j], char.get(ransomNote[j]) - 1);
        } else
            return false;
    }

    return true;
};

magazine을 순회하면서 char라는 map에 각 문자를 저장
중복인 문자라면 저장된 값에다가 +1
이번에는 ransomNote를 돌면서 map에 해당 문자가 있는지 확인
없으면 false, 있으면 값 -1 혹은 삭제
ransomNote를 무사히 다 돌았으면 true 반환

📌 결과

Accepted
Runtime 73ms (Beats 58.25%)
Memory 51.72MB (Beats 90.09%)

📚 러닝 포인트

일단 문제 주제가 hashmap이었기 때문에 map을 사용해서 구현해봤다. sliding window 때랑 비슷한 문제여서 빠르게 풀 수 있었다. 워낙 쉬운 문제라 map을 사용하지 않으면 엄청 간단하게 구현이 가능하다. 그 중에 제일 인상 깊었던건 magazine을 돌면서 각 문자가 ransomNote에 있으면 빈 문자열로 replace하고 전부 순회한 다음에 ransomNote가 빈 문자열, 즉 모든 문자가 magazine에 있었다는 게 확인되면 true, 아니면 false를 반환하는 방법이었다. 아마 코딩테스트에 이런 문제가 나오면 그렇게 푸는게 훨씬 나을 것이라는 생각을 했다.

// 61ms(91.25%) 52.07MB(82.64%)
var canConstruct = function(ransomNote, magazine) {
    for (let i = 0; i < magazine.length; i++)
        ransomNote = ransomNote.replace(magazine[i], '');

    if (ransomNote === '')
        return true;
    return false;
};
profile
나도 할 수 있을까?

0개의 댓글