문제 링크 : 좋은 단어-백준
이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 '좋은 단어'나 세보기로 마음 먹었다.
평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.
첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)
다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.
첫째 줄에 좋은 단어의 수를 출력한다.
3
ABAB
AABB
ABBA
2
def goodString(string):
if len(string) % 2 != 0:
return False
else:
stack = [string[0]]
for i in range(1, len(string)):
if len(stack) == 0:
stack.append(string[i])
continue
if stack[-1] == string[i]:
stack.pop()
else:
stack.append(string[i])
if len(stack) == 0:
return True
else:
return False
count = 0
for _ in range(int(input())):
string = input()
if goodString(string):
count += 1
print(count)
스택을 이용해서 풀었다. 먼저 스택에 문자열의 첫번째 문자를 넣고 시작한다. 문자열 끝까지 반복문을 타며 문자와 스택에 있는 문자를 비교한 후 같으면 스택에서 pop하고 같지 않으면 push하는 원리로 코드를 작성했다. 반복문을 다 마치고 스택에 문자가 남아있으면 맞는 짝의 문자가 없는것이니 문제에서 말하는 '좋은단어' 가 아닌것으로 풀었다. 한가지 유의해야 할 점은 계속 문자의 쌍이 맞아 pop이 되어 스택이 비어있는데 비어있는 스택과 문자를 비교하려고 하면 index 에러가 뜨기 때문에 그때는 비교하지 않고 바로 스택에 넣어주고 continue를 통해 다음 반복으로 탈 수 있게 했다.