두 개의 문자열 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;
};