5. Harmless Ransom Note

What is Harmless Ransom Note?

FacHarmless Ransom Note란, 중복되는 문자열의 유무를 파악해서 true/false로 확인하는 것을 말한다.


[Problem]

2개의 문자열 중, 중복되는 문자열의 유무를 파악해서 true/false로 반환하는 함수를 작성하시오. 즉, 왼쪽 문자열의 각 단어들이 오른쪽 문자열에 1개라도 포함이 안되거나, 오른쪽 문자열의 각 동일한 단어보다 더 많을 경우, false를 반환한다.

  • 예를 들어, 왼쪽 문자열이 ‘this is my my note’ 이고, 오른쪽 문자열이 ‘this is is my note’일 때, 왼쪽 문자열의 각 단어 중 my는 왼쪽 문자열에서 2번있는데, 오른쪽에서는 1번 밖에 없으면 false를 반환해야 한다.
  • 또한, 왼쪽 문자열이 ‘this is my special note’ 이고, 오른쪽 문자열이 ‘this is is my note’일 때, 왼쪽 문자열의 special 단어는 오른쪽 문자열에 없어도, false를 반환해야 한다.


[Algorithms]


[Solution]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const harmlessRansomeNote = (noteText, magazineText) => {
//split both string parameters into arrays
let noteArr = noteText.split(' ');
let magArr = magazineText.split(' ');

//create an object to use as a hash table it also avoids exponential time complexity of nested loops
let magObj = {};


//forEach to check if word is an word is an object on our property
magArr.forEach(word => {
//if not we add it to our object
//increment the value
if (!magObj[word]) {
magObj[word] = 1;
} else {
//otherwise, if it is there
//we just increment the value
magObj[word]++;
}
}); // { this: 1, is: 2, my: 1, note: 1 }

//Boolean variable to be return from function
let noteIsPossible = true;

//use forEach to iterate through each word
noteArr.forEach(word => {
//if word is found on the object decrement it
if (magObj[word]) {
magObj[word]--;
//if word value < 0 we can't make our word so note is NOT possible.
if (magObj[word] < 0) {
noteIsPossible = false;
}
//if word is not found then the note is NOT possible.
} else {
noteIsPossible = false;
}
});

return noteIsPossible;
};

console.log(harmlessRansomeNote('this is my note', 'this is is my note')); // true