문제설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다.
예를 들어"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한 사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
접근 방법
- 입출력 예제 각각을 잘 살펴보자.
s answer "()()" true "(())()" true ")()(" false "(()(" false
- 스택을 이용해서 풀어도 되지만 괄호 판별을 위한
ans
변수만 있다면 문자열을 한 번만 순환해도 해결할 수 있는 문제라고 생각했다.- 3번 예제처럼 ")"로 시작하는 문자열은 아예 시작부터 올바르지 못하기 때문에 제외하고 시작하는 것으로 접근했다.
def solution(s):
ans = 0
# ")"로 시작하는 문자열을 사전 차단
if s[0] == ")":
return False
for c in s:
if c == "(":
ans += 1
elif c == ")":
ans -= 1
return True if ans == 0 else False
처음 시도한 코드는 다음과 같이 작동하도록 작성했다.
def solution(s):
ans = 0
# ")"로 시작하는 문자열을 사전 차단
if s[0] == ")":
return False
for c in s:
if c == "(":
ans += 1
elif c == ")":
ans -= 1
if ans < 0 :
return False
return True if ans == 0 else False
입출력 예제를 여러가지 생각해보면 조건 수정 하나로 간단하게 해결할 수 있다!
ans=0
을 유지하고 있다.c == ")"
조건에 의해 ans-=1
이 실행된다. ans = -1
이 된다. ans = -1
이 되려면 ")"가 먼저 오거나 짝이 맞지않는 조건 밖에 없다. 그러므로, 이때 return False를 하면 된다.아, 그리고 여기서 return True if ans == 0 else False
은 return ans == 0
으로 더 줄여 쓸 수 있다!