s는 여러 괄호들로 이루어진 String 인자입니다.
s가 유효한 표현인지 아닌지 true/false로 반환해주세요.
종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다. 아래의 경우 유효합니다.
한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다.
괄호 순서가 맞아야 한다.
예를 들어 아래와 같습니다.
**s =** "()"
return true
**s =** "()[]{}"
return true
**s =** "(]"
return false
**s =** "([)]"
return false
**s =** "{[]}"
return true
다 같은 한글이라도 설명이 항상 부족하고 어렵게 느껴지네요. 흠...
이해하는데 시간이 가장 많이 걸리는 이 부분.
위코드 16기 진욱님의 도움으로 풀이 할 수 있었어요.
이 자리에서 다시 한번 감사의 말을 올려요😄
def is_valid(string):
symbol = '()[]{}'
stack = []
for i in string:
index = symbol.find(i) # symbol의 인덱스 위치를 파악
if index % 2 == 0: # 짝 수로 나누어 떨어지면 열린 괄호 예. (, [, {
stack.append(i) # stack 변수에 열린 괄호를 추가함
elif stack : # 처음 string에 닫힌 괄호가 들어올 경우 처리
if stack[-1] == symbol[index-1]: # 마지막 stack에 저장된 값(예. ' ( ' )과 sybol에 저장된 값을 비교해요.
# symbol[index-1] 이 부분이 어려운데요. string = '()' 경우 현재 index는
stack.pop()
else:
return False
else:
return False
return not stack
string = '()'
print(is_valid(string))
이정표 역할을 해줄 symbol 변수를 만들어준다.
빈 리스트 변수 stack을 생성하여 일치하는 부분이 있으면 pop()
날리고, 없으면 'append()` stack에 더함(저장은 열린 괄호 종류만 하게되요. 닫힌 괄호는 저장하지 않아요.)
for
문이 끝나게 되면 for
문 바깥의 return
을 통해서 빈 리스트 변수를 판별하여 True값이 나오도록 not 키워드를 앞에 붙여줘요.
for
문에서 string
변수로부터 값을 하나하나씩 뽑아줍니다.
그리고 symbol.find(i)
를 통해서 ( <-- 열린 괄호 값의 인덱스 위치를 반환해서 index 변수에 정수로 저장해요.
if
문에서 index % 2 == 0
부분은 2로 나누어 떨어지는지 아닌지 판별하게 되는데요.
index에 현재 0의 정수(__ ' ( '의 위치 인덱스)가 들어왔으니
열린 괄호를 stack
변수에 저장해요.
그리고 다시 for문을 돌면서 string에 있는 1번째 인덱스 값인 ( 를 뽑아냅니다.
그리고 if문은 조건에 부합하지 않아 건너뛰고(홀수라서) elif
에서 이미 stack
변수의 값이 존재하는 경우를 판별해요.
elif
안의 판별하는 경우는 예를 들어
string 값이 ' ( ( } '
오는 경우 확인 할 수 있어요.
elif안의 if문에서 stack[-1] == symbol[index-1] ( == {
조건을 판별하게 되요.
물론 False 임으로
다음 else
로 넘어가서 string 값이 잘못되었다고 False
를 리턴하게되요.
그렇다면 끝에서 2번째 리턴은 어떤 경우에 적용될까요?
대표적으로 string = '))'
닫힌 괄호로 이루어진 경우가 되겠조?
닫힌 괄호의 인덱스를 find()
메서드로 symbol
에서 찾게되면 index는 1,3,5 홀수가 나오게 되요.
거기에 더불어 저장을 하지 못한 stack 변수는 elif에서 진입하지 못하니 마지막 else
문을 만나서 처리하게 되는거조.