올바른 괄호

yongju·2022년 11월 8일
0

Programmers

목록 보기
13/23
post-thumbnail

프로그래머스 레벨2 [정답율 74%]
❓문제

❗문제 정리
사용한 파라미터 :
queue : 입력받은 괄호 문자열을 list로 저장
left(list/string) : 왼쪽 괄호 저장

풀이방법 :
1. '('와 ')'의 수가 같아야함.
2. 시작은 '(', 끝은 ')'가 되어야함.
3. '('가 들어가면 ')'가 나와야함.

📑코드

from collections import deque
def solution(s):
    queue=list(s)
    left=[]
    if s.count("(")==s.count(")"):
        if s[0]=='(' and s[-1]==')':
            for x in queue:
                if x=='(':
                    left.append(x)
                elif x==')' and left and left[-1]=='(':
                    left.pop()
                else:
                    return False
            if not left:
                return True
        else:
            return False
    else:
        return False
        

📝코드 설명

    queue=list(s)
    left=[]

deque로 입력받은 문자열 저장하여 리스트화시킴
'(' 저장할 left 리스트 선언

if s.count("(")==s.count(")"):

조건1) '(', ')'의 개수가 같아야함. 아닌 경우, False리턴

        if s[0]=='(' and s[-1]==')':

조건2) 양 사이드가 '(', ')' 이어야함.

for x in queue:
                if x=='(':
                    left.append(x)
                elif x==')' and left and left[-1]=='(':
                    left.pop()
                else:
                    return False

조건3) '('로 시작하면, ')' 닫혀야함.
'('가 나오면 left에 저장했다가, ')'가 나오고 (left가 비어있지 않고) left에 '('가 있으면, left에 있던 '('을 없앰. (()() 이런식으로 괄호가 닫히지 않으면 else문이 실행되어 false반환.

if not left:
         return True

🔥파이써닉한 코드🔥 list가 비어있지 않으면, True반환

🎖제출 결과

💡insight
테스트 17번은 괄호의 개수를 비교해야함.
list로 할 수 있으면 하는게 좋은듯. deque보다 list가 시간 복잡도가 좋다(?) 테스트에서 1ms 줄어듦.
반례: ()())(()

  • '('와 ')'의 개수가 4개로 동일
  • 양끝이 '(' ')'로 잘 닫혀있음
  • but, ')'로 시작하는 괄호가 있어서 false가 반환되어야함.
profile
AI dev

0개의 댓글