갱스터하우스

[Python] Lv2.올바른 괄호 본문

코테 문제/프로그래머스

[Python] Lv2.올바른 괄호

승갱 2022. 5. 3. 12:17

https://programmers.co.kr/learn/courses/30/lessons/12909

 

코딩테스트 연습 - 올바른 괄호

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

programmers.co.kr

 

 

 

 

 

문제 설명

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

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

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

 

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

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

 

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

 

나의 접근방법 및 풀이

처음에 문제를 보고 그럼 '('랑 ')'의 개수가 같아야 True 아닌가? 생각으로 아래의 코드처럼 실행했지만, 여기서 중요한 점을 빼먹었었다. 바로 '올바른 괄호'이다. 문제 설명에서

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

라고 명시되어있는 것 처럼 둘의 숫가 같더라도 올바른 맺음관계가 아니므로, 이는 False이다.

def solution(s):
    answer = True
    cnt = 0
    for i in s:
        if i == '(':
            cnt += 1
        else:
            cnt -=1 
    if cnt == 0:
        return True
    else:
        return False

다른 사람들의 풀이에서 pop()을 가져와 적용해봤다. 

올바르지 않은 괄호를 판단하는 건 크게 두가지이다.

 

(1) 처음부터 ')'가 나오는 경우 : ')()('

(2) 맞는 것 같은듯하다 아닌 경우: '((())('

 

먼저, (1)은 바로 거를 수 가 있다.

i가 ')'가 나온 상태에서 tmp가 빈 리스트라면 짝이없는 괄호이기때문에 False!

 

(2)의 경우에는 pop을 이용해서 최종적으로 판단해야 한다.

→ 만약 빈리스트가 아니라면 tmp에서 pop하면 된다. Why? → tmp에는 ')'만 추가되기 때문이다.

for()문 종료 후, tmp가 빈 리스트라면 짝을 다 찾아갔기 때문에 True, 아니라면 짝이 안 맞기때문에 False

def solution(s):
    answer = True
    tmp = []
    for i in s:
        if i == '(':
            tmp.append(i)
        else:       #')'
            if tmp == []:
                return False
            else:
                tmp.pop()   ## 마지막 요소 꺼내
    if tmp == []:
        return True
    else:
        return False

 

다른 풀이

오...아직 이 단계까지 가려면 멀었다!

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

'코테 문제 > 프로그래머스' 카테고리의 다른 글

[Python] Lv2.H-Index  (0) 2022.05.15
[Python] Lv2. 스킬트리  (0) 2022.05.03
[Python] Lv2.최댓값과 최솟값  (0) 2022.04.30
[Python] Lv2. 피보나치수  (0) 2022.04.30
[Python] Lv1.최소직사각형  (0) 2022.04.19