205. Isomorphic Strings
2026-03-20
리트코드 205번 풀이
문제
풀이 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가 아니라면 false
if (mapTS.has(cT) && mapTS.get(cT) !== cS) return false; // t에서 cT가 이미 매핑되어 있는데, 그 매핑이 cS가 아니라면 false
mapST.set(cS, cT);
mapTS.set(cT, cS);
}
return true; // 모든 문자에 대해서 매핑이 질 이루어졌다면 true
}시간 / 공간 복잡도
- 시간 복잡도: O(n)
- 공간 복잡도: O(n)