본문 바로가기

Coding test

[백준 9012/파이썬] 괄호

 

소스코드

#백준 9012 괄호문제
N = int(input())            #N개 입력받기
stack = []  
compare_stack = []
for i in range (N):
  ps = input()
  for j in range (len(ps)):
    stack.append([])          #2차원 배열로 스택 구현
    stack[i].append(ps[j])    #스택에 추가

for i in range (N):
  ans = 0
  while (len(stack[i])) :
    if (stack[i][-1]==')') :                  #스택에 꺼낼게 )면
      compare_stack.append(stack[i].pop())    #스택에 있는걸 꺼내서 비교 스택에 삽입
    elif (stack[i][-1]=='(') :                  #스택에 꺼낼게 (면
      if len(compare_stack) ==0:              
        ans += 1
        break
      if (compare_stack[-1] == ')') : #비교 스택에 ')' 스택에 '('가 있으면 둘다 삭제
          compare_stack.pop()
          stack[i].pop()      
  if (len(compare_stack)) != 0:   #비교스택에 남아있는게 있으면 안됨
      ans += 1      
  compare_stack.clear()
  if ans >= 1:
    print("NO")
  else : print("YES")

 

알고리즘

문자열로 입력을 받아 2차원 list로 구현하기

 

1. 오른쪽에 ")"가 있으면 pop하여 비교 스택에 저장.

2. 왼쪽에 "("가 있을때  비교 스택에 ")"이 있으면 둘다 pop

3. 왼쪽에 "("가 있을때  비교스택이 비어있으면 괄호 성립안함

4. 괄호의 pop이 끝났는데 비교스택에 남아있으면 괄호 성립 안함

 

특이사항

  for j in range (len(ps)):
    stack.append([])          #2차원 배열로 스택 구현
    stack[i].append(ps[j])    #스택에 추가

입력 받는 부분에서 2차원 배열을 선언하는 부분인데요

1차원 list를 선언하고 append([])를 하면 2차원 list로 사용할 수 있습니다.

stack[0]

stack[0][]

stack[0]['('], stack[0]['('] ,stack[0][')'] ... 

  if ans >= 1:
    print("NO")
  else : print("YES")

출력 부분에서 중간 과정에 print("NO")를 하니 print("YES")부분이 처리가 어려워져서 정답변수를 만들어서 편리하게 출력할 수 있었습니다.