유형
문제 설명
짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
예를 들어, 문자열 S = baabaa 라면
b aa baa → bb aa → aa →
의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.
제한 조건
- 문자열의 길이 : 1,000,000이하의 자연수
- 문자열은 모두 소문자로 이루어져 있습니다.
입력
- ex1) baabaa
- ex2) cdcd
출력
- ex1) 1
- ex2) 0
# TRY 1) 시간 초과
def solution(s):
s = list(s)
stop = 0
while stop == 0:
for i in range(len(s)-1):
if i < (len(s)-1) and s[i] == s[i+1]:
s[i] = 0
s[i+1] = 0
check1 = len(s)
while 0 in s:
s.remove(0)
check2 = len(s)
if check1 == check2:
stop += 1
return 1 if len(s)==0 else 0
# SOL 1) stack을 이용한 풀이
def solution(s):
stack = []
for i in s:
if len(stack) != 0 and stack[-1] == i:
stack.pop()
else:
stack.append(i)
return 1 if len(stack)==0 else 0
문자열을 순회하면서 현재 원소(=문자)와 지금까지 나온 원소 중 짝이 없어서 stack에 쌓인 원소들 중 가장 최근의 원소와 같으면 stack[-1]의 값을 pop하고 현재 원소는 stack에 저장하는 절차 없이 다음 루프로 넘어간다. 만약 같지 않으면 현재 원소를 stack에 추가하는 방식으로 반복하여 진행한다. 최종적으로 stack에 아무 원소도 없으면 모두 짝지어진 것이기 때문에 1 return, 남은 원소가 있으면 0 return 한다. 여기서 포인트는 stack은 현재 원소와 이전 원소가 매칭될 수 있는지 여부를 확인하는 장치이고, 현재 원소가 매칭이 가능한 원소이면 이 원소를 stack에 쌓는 과정은 생략된다는 것이다.