아마도 어제(22년 10월 25일)인가?의 daily leetcode 문제.
처음에 문제를 잘못 읽어서 hard인데? 하고 생각했다가 코테 톡에서 말한 거를 듣고 그냥 join 문제였구나.. 했다가 누군가 도전과제로 Memory Usage를 O(1)
으로 해서 풀어보는 것도 도전과제겠다라는 말에 필이 꽃혀서 트라이를 하게 되었다.
두 개의 string만을 가지고 있는 배열 word1 : list
, word2 : list
가 주어진다. 이 두 배열을 합쳤을 때 같은 문자가 되는지 확인하고, True or False
를 반환하는 문제..
class Solution:
def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:
return ''.join(word1) == ''.join(word2)
코드가 본의아니게 좀 복잡해졌기 때문에 우선 코드를 보여주고 설명한다.
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
기본 세팅으로 word1
과 word2
의 몇번째 원소를 보고 있는지를 제어하는 currl
과 currr
, 그리고 그 원소들에서 몇번째 글자를 보고 있는지를 체크하기 위한 l
과 r
, 마지막으로 word1[currl]
과 word2[currr]
의 길이 lengl
,lengr
이 필요하다.
(조금 더 극단적으로 메모리 사용을 줄이기 위해 마지막 두 변수 lengl
과 lengr
은 뺄 수도 있기는 하지만, 변수 4개를 쓰나 6개를 쓰나 도찐개찐인데다, while: try:
내의 두 if
문에서 체크하는 과정이 루프가 돌때마다 시간을 소모할 수 밖에 없기 때문에 효율을 위해서 추가해줬다.)
while
의 경우 숫자가 끝날 때까지 돌기위해 사용했고, try & except
는 이 문제에서야 제어가 가능하기는 하지만 굳이 귀찮기 때문에..
while
바로 아래 4개의 lengl,lengr,currl,currr
를 확인하는 if
문이 들어가야 할 것이다.if
: l
이 word1[currl]
바깥에 있을 때 다음으로 넘어가게 제어해주는 코드.if
: 위와 비슷한, word2
에서 체크하는 코드.if
: 중간에 다르면 False
반환.except
: 모든 문자가 돌았을 때 만약 정확하게 일치해서 True
를 반환하는 경우는 첫 번째 if
에서 currl += 1
이 실행되고, word1
에서 currl
번째 원소가 없기 때문에 except
가 작동하게 된다. 그리고 그 때r
과 currr
의 위치는 각각 lengr
과 len(word)-1
이 되고, 이게 아닐 경우 False
를, 반환하게 된다.end