백준 9012번 : 괄호

2024. 5. 23. 22:27개인활동/코테

https://www.acmicpc.net/problem/9012

 

이 문제는 스택을 활용한 문제이다.

어떻게 스택이랑 연관지어야 할지 고민하던 중, "(" 이것을 push, ")" 이것을 pop으로 활용하여 문제를 풀어보기로 하였다.

count = int(input())

for _ in range(count):
  vps_str = input()
  vps_list = []
  try: 
    for i in vps_str:
      if  i == "(":
        vps_list.append(i)
      else:
        vps_list.pop()
    
    print("YES" if len(vps_list) == 0 else "NO")
  except IndexError:
    print("NO")

1. vps가 맞는지를 확인할 때 사용할 비어있는 리스트와 입력받을 문자열 변수 설정

2. pop 과정에서 index error가 발생할 수 있기 때문에 try-except 문을 이용하여 코드 작성

3. "("을 입력받은 경우 스택에 push

4. ")"을 입력받은 경우 스택에서 pop 해줌

5. 이 과정에서 리스트가 비어있다면 vps가 맞음

6. 만약 index error가 떴거나 리스트가 비어있지 않다면 vps가 아님

 

 

이렇게 풀어서 성공~

 

다음은 숏코드 분석이다.

오랜만에 백준 숏코드를 보니 예전에 찾아봤던 내용들도 가물가물하다.

exec(("print('YNEOS'[''<input()"+".replace('()','')"*25+"::2]);")*int(input()))

다른 부분보다 exec 함수가 무엇인지 좀 알아보는 것이 좋을 것 같아 이 부분만 알아보려고 한다.

이 내부에 문자열로 넣어주면 코드를 실행할 수 있게 되는 것인데...

 

https://docs.python.org/ko/3/library/functions.html#exec

 

Built-in Functions

The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...

docs.python.org

 

("print(
	'YNEOS'
    	[''<input()"
  +
 	".replace('()','')" * 25
  +
  	"::2]);"
 )
 
 *int(input())

이 안의 코드를 쪼개서 보자면

일단 print문을 입력받은 int(input())만큼 반복하며, 이 안에는

 

"YNEOS"가 포함되어있고, 이를 슬라이싱 하는 조건은 다음과 같다.

['' < input().replace('()', ' ') : : 2]

빈 문자열이 input().replace('()', ' ') 이 값보다 작은 것이 참인지, 거짓인지를 기준으로 시작점이 달라지는 듯 하다.

참이면 0, 2, 4번째 문자열 즉 YES를 출력하게 되고 거짓이면 1, 3번째 문자열 즉 NO를 출력하게 된다.

 

복잡한 수식...

그러나 꽤 재미있다.