one line of code at a time
[leetcode] 1657. Determine if Two Strings Are Close 파이썬 코드 본문
operation 1을 보고서는 풀 수 있을 것 같았다.
두 개의 캐릭터를 스왑한다는 건 개수가 같으면 된다는 뜻이니까 말이다.
operation 2에서 막혔다.
다른 사람의 풀이를 듣고 힌트를 얻었다.
operation 2가 되려면 frequency를 카운트하면 된다.
word1 = "cabbba"가 있고, word2 = "abbccc"가 있다고 할 때
word1에서 a는 2개, b는 3개, c는 1개가 나온다.
그리고 2, 3, 1이라는 숫자가 각각 한 번씩 나온다.
word2에서 a는 1개, b는 2개, c는 3개가 나온다.
그리고 1, 2, 3이라는 숫자가 각각 한 번씩 나온다.
그러므로 word1로부터 word2를 만들 수 있어서 답은 True이다.
풀이 방법 정리
(1) word1과 word2의 알파벳별 frequency를 저장하는 딕셔너리 charNum1, charNum2를 만들었다.
(2) word1과 word2의 알파벳 구성이 같은지 확인한다. 이걸 확인 안 하면 word1 = "uua", word2 = "ssx" 와 같은 테케에서 오답이 나온다.
(3) frequency의 빈도수를 저장하는 freqChar1, freqChar2를 만든다. 이 hashmap의 value 값의 길이가 같으면, operation 2를 수행할 수 있다는 의미다.
class Solution(object):
def closeStrings(self, word1, word2):
if len(word1) != len(word2):
return False
charNum1 = dict()
charNum2 = dict()
for w in word1:
if w not in charNum1:
charNum1[w] = 1
else:
charNum1[w] += 1
for w in word2:
if w not in charNum2:
charNum2[w] = 1
else:
charNum2[w] += 1
# charNum1과 charNum2의 알파벳 구성이 같은지 확인
char1 = set(charNum1.keys())
char2 = set(charNum2.keys())
if char1 != char2:
return False
freqChar1 = defaultdict(list)
freqChar2 = defaultdict(list)
for key, value in charNum1.items():
freqChar1[value].append(key)
for key, value in charNum2.items():
freqChar2[value].append(key)
for key, value in freqChar1.items():
char1_freq = len(value)
char2_freq = len(freqChar2[key])
if char1_freq != char2_freq:
return False
return True

'leetcode' 카테고리의 다른 글
| [leetcode] 1161. Maximum Level Sum of a Binary Tree 파이썬 코드 (0) | 2024.08.16 |
|---|---|
| [leetcode] 2390. Removing Stars From a String 파이썬 코드 (0) | 2024.08.14 |
| [leetcode] 2352. Equal Row and Column Pairs 파이썬 코드 (0) | 2024.08.13 |
| [leetcode] 1207. Unique Number of Occurrences 파이썬 코드 (0) | 2024.08.13 |
| [leetcode] 1004. Max Consecutive Ones III 파이썬 코드 (0) | 2024.08.13 |