문제 :
두개의 문자열이 인자들로 주어지고, 두 문자열이 동형인지 판별하면 된다. 여기에서의 "동형"은 각 문자열의 문자들이 동일한 알파벳으로 매핑된다는 것이다. 예를들어, 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 객체의 길이에 맞춰서 순회가 종료된다.
'CodingTest > Leetcode' 카테고리의 다른 글
[LeetCode] #594. Longest Harmonious Subsequence (0) | 2024.06.25 |
---|---|
[LeetCode] #290. Word Pattern (0) | 2024.06.21 |
[LeetCode] #202. Happy Number (0) | 2024.06.19 |
[LeetCode] #674 Longest Continuous Increasing Subsequence (0) | 2024.06.19 |
[LeetCode] #645. Set Mismatch (1) | 2024.06.18 |