두 문자열 s, t가 동형인지 확인
즉, s의 문자들이 t와 1:1로 대체되면 true 아니면 false
Input: s = "foo", t = "bar"
Output: false
Input: s = "paper", t = "title"
Output: true
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isIsomorphic = function(s, t) {
let s_map = new Map();
let t_map = new Map();
for (let i = 0; i < t.length; i++) {
if ((s_map.has(s[i]) && s_map.get(s[i]) !== t[i]) ||
(t_map.has(t[i]) && t_map.get(t[i]) !== s[i])) {
return false;
} else {
s_map.set(s[i], t[i]);
t_map.set(t[i], s[i]);
}
}
return true;
};
두 문자열의 길이가 똑같이 주어지기 때문에 문자열을 순회하면서
두 개의 map에 각각 자신의 문자와 매핑되는 다른 문자를 저장
양쪽의 매핑 문자가 서로가 아닌 것이 발견되면 바로 false 반환
즉, 둘 다 서로의 문자를 key로 가지고 있고 그 값이 서로일 때와
둘 다 서로의 문자가 map에 없을 때만 저장 후 넘어가고 나머지는 다 false
Accepted
Runtime 54ms (Beats 87.61%)
Memory 50.73MB (Beats 48.82%)
처음에는 쉽다고 생각하고 Map 한 개로 구현했었는데, 테스트 케이스에서 막히는 걸 보고 두 개를 사용해야한다는 걸 깨달았다. 조건을 다는게 살짝 헷갈리기는 했는데 금방 적어냈다. 그리고 처음에는 if문 조건을 가독성을 위해 else if로 나누어서 달았는데, 런타임 효율이 별로여서 OR을 사용해 하나로 묶어봤더니 14ms나 줄어들었다. 아무리 생각해도 앞선 조건이 0이라면 뒤의 조건을 계산해야하기 때문에 과정의 차이가 있을 수가 없는데 무슨 일일까, 나도 모르는 else if문의 성능 문제가 있는 건가? 하고 열심히 찾아봤는데 도저히 이유를 찾을 수 없었다. 그래서 다시 한 번 돌려보니까 같은 코드로 80ms까지 나왔다 (...) 리트 코드가 제출을 할 때마다 다른 테케나 환경 조건을 쓰는 건지 매번 차이가 심한 결과를 내준다...