꾸준히 안타치기
3986 - 좋은단어(stack) 본문
https://www.acmicpc.net/problem/3986
문제
이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 '좋은 단어'나 세보기로 마음 먹었다.
평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.
입력
첫째 줄에 단어의 수 N이 주어진다. (1 ≤ N ≤ 100)
다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.
출력
첫째 줄에 좋은 단어의 수를 출력한다.
예제 입력 1
3
ABAB
AABB
ABBA
예제 출력 1
2
💡 이 문제를 보고 내가 생각한 것들, 생각한 순서
테스트 케이스 단어의수 N입력받기
N개의 줄만큼 A와B로 이루어진단어 입력받기
AB는 번갈아서 올수 없다. 처음과 끝이 같다.
연속으로 2번 나오기 되나 세번나오면 안됨 ( 짝수번 반복은 가능하나 홀수번은 안됨 )
한번 나오고 두번 연속나오고 한번은 가능.. ( 알파벳이 짝수개일때만 가능 but 교차해서나오면 안됨)
괄호 문제랑 비슷한 것같다.
출력: pop할때마다 좋은단어의수 +1 증가 시키고, 좋은 단어의 수를 출력한다.
💡 어떤 자료구조를 택했고 그 이유는?
스택
스택에 단어를 넣고, 스택의 마지막 값과 같으면 삭제
제거 할때마다 좋은단어의 수 +1 증가
스택에 단어가 남아 있으면 짝이 맞지 않는 것이므로 좋지 않은 단어이다.
💡 그 자료구조를 이용해서 구체적으로 문제를 해결하는 로직 (풀이법)
import sys
input = sys.stdin.readline
N = int(input().rstrip() // 테스트케이스입력받기 // 입력받은 숫자 오른쪽 공백제거
cnt = 0 // 좋은단어의 수
for _ in range(N):
temp = input().rstrip() //글자입력받고 공백제거후 temp에 넣기
stack = [] // 스택생성
for i in range(len(temp)): // 입력받은 글자를 크기만큼 돌면서
if stack and temp[i] == stack[-1]:// temp에 있는 -번째 글자가 스택의 마지막 것과 같으면
stack.pop() // 삭제한다.
else: // 같지않으면, 스택에 넣는다.
stack.append(temp[i]
if not stack: //스택에 없으면 값을 1추가한다.
cnt += 1
print(cnt) // 좋은단어의 수를 출력
💡 문제에서 중요한 부분
스택 사용법익히기
rstrip() 함수
readline()은 개행문자(줄바꿈문자를 포함하고있다.) 그래서 문자열 마지막에 개행문자가 포함되어 출력이된다.
이러한 공백없이 출력하게 해주는 함수가 있다.
- rstrip()
- : 오른쪽 공백을 삭제
- lstrip()
- : 왼쪽 공백을 삭제
- strip()
- : 왼쪽, 오른쪽 공백을 삭제
'CS > 백준' 카테고리의 다른 글
13417 - 카드문자열 ☑️ (deque, Array) (0) | 2022.07.11 |
---|---|
1302 - 베스트셀러(map) 💭 (0) | 2022.07.11 |
1764 - 듣보잡(set) (0) | 2022.07.11 |
1158 - 요세푸스 문제(deque) (0) | 2022.07.11 |
1417 - 국회의원 선거 (0) | 2022.07.11 |