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
("print(
'YNEOS'
[''<input()"
+
".replace('()','')" * 25
+
"::2]);"
)
*int(input())
이 안의 코드를 쪼개서 보자면
일단 print문을 입력받은 int(input())만큼 반복하며, 이 안에는
"YNEOS"가 포함되어있고, 이를 슬라이싱 하는 조건은 다음과 같다.
['' < input().replace('()', ' ') : : 2]
빈 문자열이 input().replace('()', ' ') 이 값보다 작은 것이 참인지, 거짓인지를 기준으로 시작점이 달라지는 듯 하다.
참이면 0, 2, 4번째 문자열 즉 YES를 출력하게 되고 거짓이면 1, 3번째 문자열 즉 NO를 출력하게 된다.
복잡한 수식...
그러나 꽤 재미있다.
'개인활동 > 코테' 카테고리의 다른 글
[프로그래머스] 자릿수 더하기 (0) | 2024.05.25 |
---|---|
백준 4949번 : 균형잡힌 세상 (0) | 2024.05.24 |
[프로그래머스] 약수의 합 (0) | 2024.05.20 |
[프로그래머스] 문자열을 정수로 바꾸기 (0) | 2024.05.19 |
[프로그래머스] 문자열 내의 p와 y의 갯수 (0) | 2024.05.18 |