Leet Code 1662(자체 Medium)

HJ seo·2022년 10월 26일
0

Coding Test(Python)

목록 보기
41/45

문제 링크

잡담.

아마도 어제(22년 10월 25일)인가?의 daily leetcode 문제.
처음에 문제를 잘못 읽어서 hard인데? 하고 생각했다가 코테 톡에서 말한 거를 듣고 그냥 join 문제였구나.. 했다가 누군가 도전과제로 Memory Usage를 O(1)으로 해서 풀어보는 것도 도전과제겠다라는 말에 필이 꽃혀서 트라이를 하게 되었다.

문제 설명.

두 개의 string만을 가지고 있는 배열 word1 : list, word2 : list가 주어진다. 이 두 배열을 합쳤을 때 같은 문자가 되는지 확인하고, True or False를 반환하는 문제..

풀이1.

  • join 사용.
class Solution:
    def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:
        return ''.join(word1) == ''.join(word2)

풀이2.

  • join 미사용. - 즉, 배열과 그 원소를 돌면서 하나하나씩 확인을 해볼 수 밖에 없다..!

코드가 본의아니게 좀 복잡해졌기 때문에 우선 코드를 보여주고 설명한다.

class Solution:
    def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:
        l,r,currl,currr = 0,0,0,0
        lengl,lengr = len(word1[currl]),len(word2[currr])
        
        while True:
            try:
                if l == lengl:
                    currl += 1
                    lengl = len(word1[currl])
                    l = 0
                if r == lengr:
                    currr += 1
                    lengr = len(word2[currr])
                    r = 0
                    
                if word1[currl][l] != word2[currr][r]:
                    return False

                l += 1
                r += 1
                
            except:
                if (currl == len(word1) and currr+1 == len(word2) and r == lengr):
                    return True
                return False

기본 세팅으로 word1word2의 몇번째 원소를 보고 있는지를 제어하는 currlcurrr, 그리고 그 원소들에서 몇번째 글자를 보고 있는지를 체크하기 위한 lr, 마지막으로 word1[currl]word2[currr]의 길이 lengl,lengr이 필요하다.
(조금 더 극단적으로 메모리 사용을 줄이기 위해 마지막 두 변수 lengllengr은 뺄 수도 있기는 하지만, 변수 4개를 쓰나 6개를 쓰나 도찐개찐인데다, while: try: 내의 두 if문에서 체크하는 과정이 루프가 돌때마다 시간을 소모할 수 밖에 없기 때문에 효율을 위해서 추가해줬다.)

while의 경우 숫자가 끝날 때까지 돌기위해 사용했고, try & except는 이 문제에서야 제어가 가능하기는 하지만 굳이 귀찮기 때문에..

  • 만약 제어를 한다고 해도 while 바로 아래 4개의 lengl,lengr,currl,currr를 확인하는 if문이 들어가야 할 것이다.
  1. 첫 번째 if : lword1[currl] 바깥에 있을 때 다음으로 넘어가게 제어해주는 코드.
  2. 두 번째 if : 위와 비슷한, word2에서 체크하는 코드.
  3. 세 번째 if : 중간에 다르면 False 반환.
  • except : 모든 문자가 돌았을 때 만약 정확하게 일치해서 True를 반환하는 경우는 첫 번째 if에서 currl += 1이 실행되고, word1에서 currl번째 원소가 없기 때문에 except가 작동하게 된다. 그리고 그 때rcurrr의 위치는 각각 lengrlen(word)-1이 되고, 이게 아닐 경우 False를, 반환하게 된다.

end

profile
다양한 분야에 관심이 많은 초보 개발자 입니다.

0개의 댓글