코딩테스트[파이썬]/입문자를 위한 코딩테스트 핵심

[스택 과 큐] -연속된 문자 지우기

softmoca__ 2024. 1. 23. 14:34
목차

연속된 문자 지우기

매개변수 s에 문자열이 주어지면 이웃한 두 개의 문자가 같으면 두 문자를 제거합니다. 이 과 정을 반복해서 최종적으로 남는 문자만으로 이루어진 문자열을 반환하는 프로그램을 작성하세요.
만약 "acbbcaa"라는 문자열이 주어진다면 최초 bb가 연속되어 있어 제거하고 나면 "accaa"가 되고, 다시 cc가 연속되어 제거하면 "aaa"가 되고 "aa"연속되어 제거하면 "a"가 최종적으로 남 습니다.

제한사항:
• 문자열 s의 길이는 100,000을 넘지 않습니다.

• 문자열 s는 소문자로만 이루어져 있습니다.

 

나의 코드

def solution(s):
    answer = ""
    stack=[]
    stack.append(s[0])

    for i in range(1,len(s)):
        if stack and stack[-1]==s[i]:
            stack.pop()
        else:
            stack.append(s[i])
    
    return answer.join(map(str,stack))

print(solution("acbbcaa"))
print(solution("bacccaba"))
print(solution("aabaababbaa"))
print(solution("bcaacccbaabccabbaa"))
print(solution("cacaabbc"))

파이썬 리스트의 특징인 [-1]이 가장 마지막 요소를 가리킨다는 특성을 이용해서 작성하였다.

 

 

 

정답 코드

def solution(s):
    stack = []
    for x in s:
        if stack and stack[-1] == x:
            stack.pop()
        else:
            stack.append(x)
            
    return "".join(stack)

print(solution("acbbcaa"))
print(solution("bacccaba"))
print(solution("aabaababbaa"))
print(solution("bcaacccbaabccabbaa"))
print(solution("cacaabbc"))

나의 코드와 비교했을때 훨씬 깔끔하고 코드량이 적다.

나는 처음 stack에 s[0]값을 추가 한뒤 로직을 실행했지만

위 코드에서는 그걸 감안해서 로직을 작성하였다.

또한 join의 사용역시 굳이 Map함수를 사용하지 않고 이어 붙였다.

기억..!