소소한 컴퓨터 이야기

올바른 괄호

by Cori

문제

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다.

 

예를 들어

· "()()" 또는 "(()()"는 올바른 괄호입니다.

· ")()(" 또는 "(()("는 올바르지 않은 괄호입니다.

 

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

제한사항

· 문자열 s의 길이: 100,000이하의 자연수

· 문자열 s는 '(' 또는 ')'로만 이루어져 있습니다.

 

입출력 예

s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

풀이

1. Me

def solution(s):
    answer = []
    for i in s:
        if s[0] == ")": return False 

        if i == "(":
            answer.append("(")
        elif i == ")" and answer:
            answer.pop()
    return False if answer else True

s의 첫번째 문자가 ")"로 시작할 경우 무조건 False를 return 한다. 그렇지 않은 경우, 문자열을 순차적으로 탐색하며 "("를 만날경우에는 "("를 리스트에 넣어주고, ")"를 만날 경우에는 "("가 들어있는 리스트에서 하나씩 빼면서 짝이 맞는지 검사

 

* ")"를 만나 pop을 할 때, 빈 리스트에서 pop을 하지 않도록 answer가 빈 리스트가 아닐 경우에만 pop 하도록 설정해주었다.

 

2. Others

def is_pair(s):
    x = 0
    for w in s:
        if x < 0:
            break
        x = x+1 if w=="(" else x-1 if w==")" else x
    return x==0

"(" 문자열을 만나면 x에 1을 더하고, 그렇지 않은 경우(')'를 만남) x에서 1을 빼줌.. 그렇지 않은 경우 x를 반환. 로직이 잘 이해가지는 않는다.. ternary operator를 이용한 풀이라고 한다. if else 연산을 두 번 사용한 것이 특이사항

def is_pair(s):
    st = list()
    for c in s:
        if c == '(':
            st.append(c)

        if c == ')':
            try:
                st.pop()
            except IndexError:
                return False

    return len(st) == 0

st.pop() 연산에 대해 비어있는 경우 발생하는 에러를 처리하기 위해 try ~ except 에러문을 사용하였다.

'CS > Coding Test' 카테고리의 다른 글

스킬트리  (0) 2021.09.06
소수 만들기  (0) 2021.09.04
다음 큰 숫자  (0) 2021.09.03
숫자의 표현  (0) 2021.09.03
문자열을 정수로 바꾸기  (0) 2021.09.03

블로그의 정보

코딩하는 오리

Cori

활동하기