[BOJ] 9012. 괄호(python)

레몬커드요거트·2025년 1월 21일
0

코딩테스트준비

목록 보기
6/6
post-thumbnail

문자열을 한 문자씩 리스트에 받는 방법

  1. list() 함수 이용

    string = 'I became a zombie'
    list(string)# 공백을 포함 한 문자씩 모두 나눔

    list() 함수에 문자열을 넣으면 한 문자씩 다 나누어 리스트를 생성 (공백도 한 문자로 취급)

  2. split()함수 이용

    string.split()

    문자열에 대해 공백을 구분자로 나누어 리스트를 생성

str = []   # str은 빈 리스트입니다.
str = input()  # str은 문자열로 변환됩니다.

따라서 str = list(input()) 과 같은 형식으로 리스트를 선언하는 것이 좋음

개행문자 없이 입력받기

import sys
str = list(sys.stdin.readline().strip())

sys.stdin.readline() 뒤에 strip() 을 붙이면 된다


문제풀이 아이디어

  • (가 문자열에서 나오면 stack에 추가
  • )가 문자열에서 나오면 stack에 있는 ( pop하기
    • ) 만났을 때 문자열이 비어있거나, 문자열이 끝났을 때 stack이 차있다면 올바른 괄호 문자열(VPS)이 아닌 것

1차시도

import sys
n = int(sys.stdin.readline())

for _ in range(n):
  str = list(sys.stdin.readline().strip())

  st = []
  for x in str: 
    if x == "(":
      st.append(x)
    else:
      if len(st)==0: #")"만났는데 stack이 비어있는 경우
        print("NO")
      else:
        st.pop()

  if len(st) == 0: 
    print("YES")
  else: #stack이 차있는 경우
    print("NO")
6
(())())
NO
YES

다음과 같은 경우 str[-2]까지 stack이 비어있고, stack[-1]이 ) 이므로 print(”NO”)가 나옴. 하지만, 스택이 비어있으므로 마지막 if문에서 YES가 출력이됨

2차시도

for x in str: 
	 if x == "(":
    st.append(x) # stack이 차있는 경우와 상관 없이 "("만난 경우
  else:
    if len(st)==0: #")"만났는데 stack이 비어있는 경우
      print("NO")
      **break**
    else:
      st.pop() # ')'만났고, (가 있다면

if len(st) == 0: #str이 끝났는데 stack비어있음
  print("YES") 
else: # str 끝났는데 stack이 차있는 경우
  print("NO")

break를 추가했지만 len(st)==0 스택이 비어있는지 아닌지 여부를 확인하는 if문이 for문 밖에 있어 도움이 되지 않음

for-else문 사용

파이썬에서는 반복문에도 else 사용가능 그래서 while-else도 존재

예시코드

for x in [1, 2, 3, 4]:
   if x % 3:
	   print(x)  # x가 3의 배수가 아니면 출력
   else:
	   print("for문 탈출")
     break  # x가 3의 배수이면 반복문에서 빠져나감
 else:
   print("리스트의 원소를 모두 출력했어요")
 
 >>> 1
 >>> 2 
 >>> for문 탈출

최종 코드

import sys
n = int(sys.stdin.readline())

for _ in range(n):
  str = list(sys.stdin.readline().strip())
  st = []

  for x in str:
    if x == "(":
      st.append(x)
    else:
      if len(st) == 0: #")"만났는데 stack이 비어있는 경우
        print("NO")
        break
      else:
        st.pop()
  else:
    if len(st)==0:
      print("YES")
    else:
      print("NO")

레퍼런스

[위키독스] 파이썬에서 for-else, while-else의 사용

profile
비요뜨 최고~

0개의 댓글