728x90

올바른 괄호


문제 설명

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


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

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

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


제한사항

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

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

입출력 예

s answer

"()()" true

"(())()" true

")()(" false

"(()(" false

입출력 예 설명

입출력 예 #1,2,3,4

문제의 예시와 같습니다. 


처음 실패한 답


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def solution(s):
    while True:
        try:
            n=s.index(")")
            
            if s[n-1]=="(":
                if not n:
                    return False
                elif n==1:
                    s = s[2:]
                else:
                    s = s[:n-1]+s[n+1:]
            else:
                return False
            
            if not len(s):
                return True
        except:
            return False
cs


슬라이싱을 이용해서 풀었더니 정확성은 다 맞았지만 효율성에서 0점을 맞아서 실패했다. 질문하기를 봤더니 스택, 혹은 카운트를 이용하면 된다고 해서 다시 풀었다.


내 성공한 답


1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(s):
    cnt = 0
    for i in range(len(s)):
        if s[i]=="(":
            cnt += 1
        elif s[i]==")":
            if cnt<=0:
                return False
            cnt -= 1
    if not cnt:
        return True
    else:
        return False
cs


남의 답 1


1
2
3
4
5
6
7
8
9
10
11
12
13
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
cs


남의 답 2


1
2
3
4
5
6
7
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
cs


남의 답 3


1
2
def is_pair(s):
    return s.count('('== s.count(')'and s.index('('< s.index(')')
cs


1199점 + 7점 -> 1206점


728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기