211116 - 짝지어 제거하기

이상해씨·2021년 11월 16일
0

알고리즘 풀이

목록 보기
13/94

◾ 짝지어 제거하기 : 프로그래머스 LEVEL 2

문제

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.


입력

  • 문자열의 길이 : 1,000,000이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

출력

  • 짝지어 제거할 수 있으면 1, 아닐 경우 0

입출력 예

sresult
baabaa1
cdcd0

◾ 풀이

1. 해설

  • LIFO 형식인 스택 개념을 이용해 해결할 수 있다.
  • 스택의 마지막 값과 문자열의 문자를 차례로 비교한다.
    • 같을 경우 스택의 값 pop
    • 다르거나 빈 스택일 경우 push
  • 문자열에 대해 위 작업을 진행한 후 스택이 비어있다면 성공, 아니라면 실패

2. 프로그램

  1. 스택을 위한 list 준비
  2. 문자열의 각 문자에 대해 차례로 검사
    • 리스트가 비어있지 않고 string[-1]ch가 같은 경우 : pop
    • 리스트가 비었거나 string[-1]ch가 다른 경우 : append
  3. 모든 작업 진행 후 string이 비었으면 성공, 아니라면 실패
# 코드
def solution(s):
    answer = 1
    string = []     # 짝지어 제거하기 위한 리스트

    # 문자열의 각 문자를 차례로 검사
    for ch in s:
        # 리스트가 비어있지않고 마지막 문자와 ch가 같은 경우
        # 리스트의 마지막 문자 삭제
        if string and string[-1] == ch:
            string.pop()
        # 아닐 경우(리스트가 비었거나 마지막 문자와 ch가 다른 경우)
        # 리스트에 ch 추가
        else:
            string.append(ch)
    # 빈 리스트가 아니라면 짝지어 제거하지 못한 경우이므로
    # answer : 0 반환
    if string:
        answer = 0

    return answer

profile
후라이드 치킨

0개의 댓글

관련 채용 정보