Koala - 16기/코딩테스트 심화 스터디
[백준/Python] 3986번: 좋은 단어
sanghyeok8473
2024. 11. 3. 09:21
문제
평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자. 이 때 단어는 A또는 B로 이루어져 있다.
입력
첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)
다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.
풀이
스택을 이용한다. 단어의 왼쪽부터 시작해서 A바로 옆에 B가 있거나, B바로 옆에 A가 있으면 좋은 단어일 수 없기 때문에, 단어의 왼쪽부터 스택에 추가하면서 조건에 따라 스택에 글자를 더할지 뺄지 결정하고, 다 끝난 뒤에는 스택이 비어있는지 여부를 통해 좋은 단어인지 알 수 있다.
또한 단어의 길이가 홀수이면 짝이 맞을 수 없으므로 처음부터 배제할 수 있다.
코드
n = int(input())
cnt = 0
for _ in range(n):
arr = input()
stack = []
if len(arr) % 2 == 1: # 길이가 홀수이면 좋은 단어가 될 수 없음
continue
for char in arr:
if stack and stack[-1] == char:
stack.pop()
else:
stack.append(char)
# 스택이 비어 있으면 좋은 단어임
if not stack:
cnt += 1
print(cnt)