📍 문제 요약
문자열 s에서 반복된 문자를 지우려고 한다. 지워진 부분은 다시 앞뒤를 연결하는데,
만약 연결에 의해 또 반복문자가 생기면 이부분을 다시 지운다.
반복문자를 지운 후 남은 문자열의 길이를 출력 하시오. 남은 문자열이 없으면 0을 출력한다.
🧩 로직 설계 1 >> X
1) 문자열 s를 스택에 1개씩 넣으면서 확인
2) 스택에 넣을 때 TOP이 지금 넣을 것과 같다면, TOP을 pop하고 넣을 것도 넣지 않음
3) 다음 것도 반복 ==> 반복 문자가 다 지워짐
4) 스택에 남아 있는 요소의 길이 출력
🧩 로직 설계 2 >> O
1) 문자열 s를 스택에 1개씩 넣으면서 확인
2) 스택이 비어있으면 현재 요소에 스택 더하기
3) 비어있지 않다면 스택의 마지막 요소와 현재 넣을 요소를 비교
4) 같다면 마지막 요소를 pop
5) 다르다면 apppend 6) 반복 종료 후 stack의 길이를 출력
💡 소스 코드
def Duplicate_test(s):
stack = []
for char in s:
if not stack: # 스택이 비어있으면
stack.append(char) # 현재 요소 스택에 더하기
else: # 비어있지 않다면 스택의 마지막 요소와 현재 넣을 요소를 비교하여
if char == stack[-1]: # 같다면 마지막 요소를 pop
stack.pop()
else:
stack.append(char) # 다르다면 append
return len(stack)
T = int(input())
for tc in range(1, T + 1):
s = input()
print(f'#{tc} {Duplicate_test(s)}')
🔎 회고
- stack을 사용한다고 해서 push / pop 을 모두 사용할 필요없이 문제에 따라 적절하게 사용해야 한다.
- pop을 사용하지 않을 경우에는 stack[-1] 로 마지막 요소를 조작할 수 있다.
- for 문에서 문자열을 바로 넣을 시 인덱스에 주의하자.