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
if문에서 따로 ==None, !=None의 조건을 걸 필요없이 if 문 자체로 검증이 가능하다.
if '조건': 자체로 조건이 True 임을 구별하듯이 None값이면 False로 인식, if '변수 or 배열'이 None이면 자동으로 Flase로 인식하여 if 문이 작동을 하지 않는다. 마찬가지로 if not을 사용하여 해당값이 None값이 아닌 것을 구분가능하다.
이는 향후 logic 짤때나 View를 짤때 유용하게 사용 될 것으로 보인다.
예) 입력 값이 None임을 구별하고자 할때 or 입력값이 존재하는지 구별을 할때