205. Isomorphic Strings 풀이 - Javascript

fgStudy·2022년 5월 25일
0

코딩테스트

목록 보기
28/69
post-thumbnail

해당 포스팅은 릿코드 205번 Isomorphic Strings 풀이를 다룬다. 문제 링크
코드는 javascript로 작성하였으며 해시로 풀었다.


문제

Given two strings s and t, determine if they are isomorphic.

Two strings s and t are isomorphic if the characters in s can be replaced to get t.

All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character, but a character may map to itself.


풀이

해당 문제는 두 문자열이 동형, 즉 일대일대응인지를 묻는 문제이다.
따라서 해시로 풀이하였다. s를 key로, t를 value로 설정하자.


예제

예제를 통해 자세히 설명하겠다.

1. 동형 예제

Input:  s = 'egg', t = 'add'
Output: true

e => a, g => d로 매핑되므로 egg와 add는 동형이다.

2. 비동형 예제

Input: s = "foo", t = "bar"
Output: false

f => b, o => a, r로 매핑된다.
o가 a와 r 두개에 대응되므로 foo와 bar는 비동형이다.


전체 코드

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function(s, t) {
    const len = s.length;
    const map = new Map();
    for (let i=0; i <len; i++) {
        const cs = s[i]; // s의 현재 문자
        const ts = t[i]; // t의 현재 문자
      	// cs 문자가 이미 나왔을 시
        if (map.has(cs)) {
          	// cs 문자와 대응된 문자열 t의 문자가 ts와 다를 시
            if (ts !== map.get(cs)) {
              // cs가 t의 여러 개의 문자와 대응되므로 비동형
              return false;
            }
          	continue;
        }
      	
      	// cs 문자가 아직 나오지 않았을 시
      	// 이미 ts가 cs가 아닌 다른 문자와 대응되었을 시
        if (getKeyByValue(map, ts)) {
          // ts가 s의 여러 개의 문자와 대응되므로 비동형
          return false;
        }
      	// cs와 ts가 둘다 다른 문자와 대응되지 않았을 시
      	// 즉 cs, ts 둘다 처음 나온 문자들 일시
        else {
          map.set(cs, ts);
        }
    }
    return true;
};

function getKeyByValue(map, value) {
    const keyList = [...map.keys()];
    return keyList.find(key => map.get(key) === value);
}
profile
지식은 누가 origin인지 중요하지 않다.

0개의 댓글