ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2021-01-22] Determine if Two Strings Are Close
    IT/자기계발 ( Leetcode ) 2021. 1. 22. 21:54
    반응형

    오늘의 문제:

    leetcode.com/explore/challenge/card/january-leetcoding-challenge-2021/582/week-4-january-22nd-january-28th/3613/

     

    오늘은 금요일!! 불금이지만 문제풀이로 오늘을 불태운다면 발전하는 나를 볼수있을것이다..

     

    이번 문제에서 주어진 Operation 2개에 대해서 이야기를 하자.

    입력값으로 주어지는 2개의 문자열에서 하나의 문자열을 Operation 1,2를 사용하여 동일하게 만들 수 있으면

    두 문자열은 가깝다고 생각하고 가까우면 True, 문자열이 동일해지지 않으면 False 를 반환하는 문제이다.

    Operation 1: 문자열에서 두 문자를 위치 변경이 가능하다. ( b -> e / e -> b )

    Operation 2: 동일한 문자가 있으면 그것까지 전부 바뀌는 문자로 변환 ( aaa -> bbb / bb -> aa )

     

    예시 1) 'abc' / 'bca' abc를 문자 순서를 두번 바꾸면 bca가 되므로 두 문자열은 가까워 반환값은 True

    예시 2) 'a' / 'aa' a를 operation 1,2로 뭘 해봐도 aa가 될수 없다.

    예시 3) 'cabbba' / 'abbccc' 문자 순서를 한번 바꾸고, 여러개 바꾸는 방법으로 변경하면 가까워질 수 있다.

    예시 4) 'cabbba' / 'aabbss' 문자열이 가진 문자의 종류가 다르므로, 'ss'를 첫번째 문자열이 가질 수 없어 False

     

    알게된 실패조건들은 다음과 같다.

     1) 주어진 문자열 두개의 길이가 다르면 무조건 False

     2) 주어진 문자열에 존재하는 문자 종류 및 문자의 개수가 다르면 False

          즉 , 'aaabbb' / 'bababa' 를 분석해보면 두 문자열 모두  a: 3, b: 3 으로 구성되어 operation 1로 동일하게 가능

          'aabbccc' / 'ccaabbb'는 a:2, b:2, c:3 / c:2, a:2, b:3 으로 다른 것 처럼 보이지만, operation1, 2를 적절히 쓰면 가능

          'aaabccc' / 'aabbcc'는 a:3, b:1, c:3 / a:2, b:2, c:2 으로 종류는 같지만 개수가 달라 불가능

     

    나는 많은 memory를 사용하고, sort가 많아 runtime도 길긴했지만, 아래와 같이 짤 수 있었다.

     

    문제풀이)

    class Solution:
        def closeStrings(self, word1: str, word2: str) -> bool:
            if len(word1)!=len(word2): # 종단조건 1 : 두 문자열의 길이가 다르면 False
                return False
            w1dict=dict()
            w2dict=dict()
            for i in range(len(word1)): # 두 문자열이 같으로 for문은 하나만 사용
                d1=word1[i]
                d2=word2[i]
                if d1 in w1dict:
                    w1dict.update({d1:w1dict[d1]+1}) # dictionary로 문자가 몇번나왔는지 저장
                else:
                    w1dict[d1]=1
                if d2 in w2dict:
                    w2dict.update({d2:w2dict[d2]+1})
                else:
                    w2dict[d2]=1
            w1keys=sorted(list(w1dict.keys())) # 각 저장한 word들의 keys와 values를 정렬하여 저장
            w2keys=sorted(list(w2dict.keys()))
            w1list=sorted(list(w1dict.values()))
            w2list=sorted(list(w2dict.values()))
            #print(w1list,w2list)
            if w1list==w2list and w1keys==w2keys: # 이 정렬된 내용이 둘다 같다면 True
                return True
            return False

     

    반응형

    댓글

Designed by Tistory.