Code KATA | # 6

Jiwon Jung·2021년 1월 10일
0

Code KATA

목록 보기
6/7
post-thumbnail

문제

s는 여러 괄호들로 이루어진 String 인자입니다.
s가 유효한 표현인지 아닌지 true/false로 반환해주세요.

종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다. 아래의 경우 유효합니다.

한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다.
괄호 순서가 맞아야 한다.

예를 들어,

s = "()"
return true
 
s = "()[]{}"
return true
 
s = "(]"
return false
 
s = "([)]"
return false
 
s = "{[]}"
return true

문제 접근 방식

문제의 중점 파악

  • 시작이 괄호가 열리면 닫혀야 true
  • 괄호 안 다른 괄호가 존재 가능하다.
  • 시작하고 닫히지 않는 괄호가 존재하면 false
  • 시작하지도 않고 닫힘 괄호가 존재하면 false

이 세가지에 대한 해결 방식으로

  • 처리하기 편하게 string을 list로 변형
  • 괄호가 열리고 닫힐려면 무조건 pair로 구성 되어야하기 때문에 len을 이용하여 짝수가 아니거나 1개 이상이 아닌 인자는 False 선언
  • 첫 번째 시작 인자가 닫힘 괄호로 시작하면 False
  • max함수에 key값을 len으로 두어 가장 긴 단어 길이 추출 return
  • 연속으로 붙어있는 종류별 완전한 괄호 부터 구분하여 리스트에서 제거, 제거 되지 않은 괄호가 존재하여 빈 리스트가 아니면 False, 빈 리스트이면 모든 요소들이 조건을 충족하기 때문에 True

나의 코드

def is_valid(string):
    element = list(string)
    if len(string) == (0 or 1):
        return False
    if string[0] == (')' or ']' or '}'):
        return False
    if len(string)%2 != 0:
        return False
    
    while True:
        track = False
        for num in range(1,len(element)):
            if str(element[num-1])+str(element[num]) == '()':
                element.pop(num)
                element.pop(num-1)
                track=True
                break
            if str(element[num-1])+str(element[num]) == '{}':
                element.pop(num)
                element.pop(num-1)
                track=True
                break
            if str(element[num-1])+str(element[num]) == '[]':
                element.pop(num)
                element.pop(num-1)
                track=True
                break

        if not track:
            break
 
    if not element:
        return True
    if element:
        return False  
        

What I Learnt

if문 자체의 True and Flase

if문에서 따로 ==None, !=None의 조건을 걸 필요없이 if 문 자체로 검증이 가능하다.
if '조건': 자체로 조건이 True 임을 구별하듯이 None값이면 False로 인식, if '변수 or 배열'이 None이면 자동으로 Flase로 인식하여 if 문이 작동을 하지 않는다. 마찬가지로 if not을 사용하여 해당값이 None값이 아닌 것을 구분가능하다.

이는 향후 logic 짤때나 View를 짤때 유용하게 사용 될 것으로 보인다.
예) 입력 값이 None임을 구별하고자 할때 or 입력값이 존재하는지 구별을 할때

profile
Venire, Videre, Vincere

0개의 댓글