var isIsomorphic = function (s, t) {
if (s.length !== t.length) return false;
let obj = {};
for (let i = 0; i < s.length; i++) {
if (obj[s[i]]) {
let cur = obj[s[i]];
if (cur !== t[i]) return false;
}
// 없다면
else {
obj[s[i]] = t[i];
}
}
// console.table(obj);
let noDups = new Set([...Object.values(obj)]).size;
let dups = Object.values(obj).length;
// console.log('길이: ', new Set([...Object.values(obj)]).size);
// console.log('길이: ', Object.values(obj).length);
return noDups === dups;
};
마찬가지로 HashMap에 관련된 문제다. 시간 복잡도는 O(N)이며, s, t
두 string이 isomorphic한지 체크하는 문제다.
obj
객체를 먼저 하나 선언해준다.
반복문을 돌며 obj
객체의 key
를 s[i]
로, value
를 t[i]
를 만든다. 그 과정에서 obj[s[i]]
의 value
값(이전)과 현재의 value
가 될 값인 t[i]
가 다르다면 false
를 return
해준다.
여기서 끝이 아니고, 지금까지는 obj
객체의 key
를 s[i]
로 했는데, unique한 key
값이 unique한 value
값과 다른 경우가 있다. let s = 'badc', t = 'badd';
같은 경우. 이 경우 obj
객체는 다음 이미지와 같다.
만약 그런 경우라면 obj
객체의 unique한 value
의 개수와, 전체 value
의 개수가 달라질 것이기 때문에, 마지막에 set
을 이용해 전체 value
가 담긴 배열을 unique하게 만든 배열과, Object.values(obj)
를 이용해 전체 value
값을 담은 배열의 길이가 같은지 비교해서 return
해주면 마무리가 된다.
수정, 지적을 환영합니다!
https://leetcode.com/problems/isomorphic-strings/