[프로그래머스 / Python] 짝지어 제거하기

·2022년 6월 22일
0

프로그래머스_LV2

목록 보기
35/39

💡 문제

짝지어 제거하기

  • 유형
  • 문제 설명

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 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

# 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

# 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에 쌓는 과정은 생략된다는 것이다.


🌵 정리

깃헙에서 전체 코드 확인하기

0개의 댓글