< 문제 간단설명 >
문자열 s와 t가 주어지면 둘이 같은 패턴을 가지는지 판단하여 return 하면되는 문제이다.
예를들어 egg와 add가 각각 s와 t라면 s에서는 처음 나오는 알파벳인 e가 한번 반복되고, 그 다음 처음 나오는 알파벳인 g가 두번 반복된다. add도 마찬가지이므로 true를 반환한다.
두번째 예시로 foo와 bar라면 foo는 o가 연속으로 두번 반복되지만 bar에서는 그런 패턴이 없으므로 false를 반환한다.
세번째 예시로 title과 paper라면 title에서 처음나왔던 t가 세번째에서 다시 등장하고, 나머지는 한번씩만 나오는 알파벳이다.
아래와 같이 색깔로 보면 이해가 쉬울수도 있다.
- egg, add // true
- foo, bar // false
- title, paper // true
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isIsomorphic = function (s, t) {
if (s.length !== t.length) return false;
let mapS = new Map();
let mapT = new Map();
const STRING_LENGTH = s.length;
for (let i = 0; i < STRING_LENGTH; i += 1) {
let curS = s[i];
let curT = t[i];
if (mapS.has(curS)) {
if (mapS.get(curS) !== curT) {
return false;
}
} else {
mapS.set(curS, curT);
}
if (mapT.has(curT)) {
if (mapT.get(curT) !== curS) {
return false;
}
} else {
mapT.set(curT, curS);
}
}
return true;
};
일단 s와 t가 문자열의 길이가 서로 다르다면 바로 false를 반환해준다.
그리고 나서 s와 t의 각 문자를 순회하면서 서로 그 자리에 매칭되는 것을 value로 할 Map을 만들어준다.
paper와 title을 예시로 든다면, 각각 첫 문자인 p를 key로 가지고, t를 value로 가지는 entry를 mapS에 넣어준다.
반대로 mapT에는 t를 key로 가지고, p를 value로 가지는 entry를 넣어준다.
위와 같이 각 문자를 순회하면서 각각의 Map에 mapping을 해주는데, 이미 mapping 되어 있는 값과 다른 값이 온다면 바로 false를 반환해주면 된다.
'PS > LeetCode' 카테고리의 다른 글
LeetCode / Linked List / 21번 / Merge Two Sorted Lists / JS (0) | 2023.03.29 |
---|---|
LeetCode / String /392번 / Is Subsequence / JS (0) | 2023.03.27 |
LeetCode / Prefix Sum / 724번 / Find Pivot Index / JS (0) | 2023.03.25 |
LeetCode / Prefix Sum / 1480번 / Running Sum of 1d Array / JS (0) | 2023.03.25 |