one line of code at a time

[leetcode] 1657. Determine if Two Strings Are Close 파이썬 코드 본문

leetcode

[leetcode] 1657. Determine if Two Strings Are Close 파이썬 코드

oloc 2024. 8. 14. 02:05

 

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