문제
풀이 1
아이디어
s→t 매핑을 Map으로, t에서 이미 사용된 문자를 Set으로 관리한다. 매핑된 문자로 s를 변환한 뒤 t와 비교해서 isomorphic인지를 확인한다.
코드
function isIsomorphic(s: string, t: string): boolean {const map = new Map();const set = new Set();const sArray = Array.from(s);for (let idx = 0; idx < s.length; idx++) {const c = s[idx];if (map.has(c)) sArray[idx] = map.get(c);else {if (set.has(t[idx])) return false;sArray[idx] = t[idx];map.set(c, t[idx]);set.add(t[idx]);}}return t === sArray.join('');}
시간 / 공간 복잡도
- 시간 복잡도: O(n)
- 공간 복잡도: O(n)
풀이 2
아이디어
풀이 1과 동일한 방식인데 set 대신 map을 두번 사용하는 방법도 있다. s→t, t→s 양방향 Map을 이용해서 매핑이 충돌하면 false를 반환한다.
코드
function isIsomorphic(s: string, t: string): boolean {const mapST = new Map(); // s -> t 문자 매핑용const mapTS = new Map(); // t -> s 문자 매핑용for (let idx = 0; idx < s.length; idx++) {const cS = s[idx];const cT = t[idx];if (mapST.has(cS) && mapST.get(cS) !== cT) return false; // s에서 cS가 이미 매핑되어 있는데, 그 매핑이 cT가 아니라면 falseif (mapTS.has(cT) && mapTS.get(cT) !== cS) return false; // t에서 cT가 이미 매핑되어 있는데, 그 매핑이 cS가 아니라면 falsemapST.set(cS, cT);mapTS.set(cT, cS);}return true; // 모든 문자에 대해서 매핑이 질 이루어졌다면 true}
시간 / 공간 복잡도
- 시간 복잡도: O(n)
- 공간 복잡도: O(n)
end