문제 : 

 

두개의 문자열이 인자들로 주어지고, 두 문자열이 동형인지 판별하면 된다. 여기에서의 "동형"은 각 문자열의 문자들이 동일한 알파벳으로 매핑된다는 것이다. 예를들어, egg - add는 다음과 같은 이유로 동형이다. (e : a || g : d || g : d) 와 같이 각 문자들이 일대일로 매핑된다.

 

먼저 "매핑"이라는걸 생각하자마자 떠오른건 당연 딕셔너리(해시테이블)이다. 그렇다면 이 문제를 딕셔너리로 어떻게 풀 수 있을까?

 

아래는 내가 제출해 통과한 코드이다.

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:

        if len(s) != len(t):
            return False

        s_to_t = {}
        t_to_s = {}

        for char_s, char_t in zip(s, t):
            if char_s in s_to_t:
                if s_to_t[char_s] != char_t:
                    return False
            else:
                s_to_t[char_s] = char_t

            if char_t in t_to_s:
                if t_to_s[char_t] != char_s:
                    return False
            else:
                t_to_s[char_t] = char_s
        return True

 

- 먼저, 두 문자열이 동형이기 위해서는 두 문자열의 길이가 같아야 한다. 길이가 다르면 동형이 될 수 없다. 또한, 길이가 다르다면 for문을 돌 필요도 없기 때문에(성능 향상), 맨 처음에 길이가 다르다면 곧바로 False를 리턴한다.

 

- 다음으로, 두개의 빈 딕셔너리를 선언해 준다.

 

- for문을 순회하며 만약 s의 문자가 s딕셔너리 안에 있다면, 동형인지 판별해주고, 없다면 딕셔너리 안에 넣어준다. 같은 일을 t에 대해서도 반복한다.

 

- 만약 이 for loop에서 False에 걸리지 않는다면, 두 문자열은 동형이므로 마지막에 return True를 리턴한다.

 

새로 알게된 내용 : 

 

- 두 개의 인자를 사용하는 `for`문:

파이썬에서는 `for`문을 사용할 때, 순회할 iterable 객체가 튜플이나 리스트와 같은 여러 값을 포함하고 있으면, 이를 풀어서 두 개 이상의 변수에 할당할 수 있다.

예를 들어, 다음과 같은 리스트가 있다고 하자:

pairs = [(1, 'a'), (2, 'b'), (3, 'c')]


이 리스트는 3개의 튜플을 포함하고 있다. 각 튜플은 두 개의 값을 가지고 있다. 이 리스트를 `for`문으로 순회하면서 각 튜플의 값을 풀어서 두 변수에 할당할 수 있다:

for number, letter in pairs:
    print(number, letter)


위 코드는 다음과 같이 출력된다 : 

1 a
2 b
3 c

 

-`zip` 함수:

`zip` 함수는 여러 iterable 객체들을 병렬로 순회하면서, 각 iterable 객체의 요소를 하나씩 묶어 튜플을 생성한다. 쉽게 말해, 여러 개의 리스트나 튜플을 동시에 순회할 수 있게 해주는 함수이다.

예를 들어, 두 개의 리스트가 있다고 해보자:

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']


`zip` 함수를 사용하면, 각 리스트의 요소를 하나씩 묶은 튜플을 생성할 수 있다:

for item1, item2 in zip(list1, list2):
    print(item1, item2)


위 코드는 다음과 같이 출력된다 :

1 a
2 b
3 c

`zip` 함수는 전달받은 iterable 객체들이 동일한 길이를 가지는 경우에 각 요소를 묶는다. 만약 길이가 다르다면, 가장 짧은 iterable 객체의 길이에 맞춰서 순회가 종료된다.

+ Recent posts