[백준] 단어 뒤집기2 풀이

Hyunwoo Park·2021년 3월 8일
0

알고리즘

목록 보기
4/19

문제 특성상 양 방향에서 뽑아내는 경우가 생기기에, collections의 모듈에 있는 deque을 import 하여 풀었습니다.
입출력 예시가 꽤 많이 주어져서 제출 전에 미리 테스트 해 볼 기회가 많은 친절한 문제였습니다.

핵심 아이디어는 입력받은 문자열 S를 돌며, 해당 인덱스의 값이 태그인지 아닌지만 구분하면 되는 것 같습니다.
그러기 위해서 flag라는 변수를 만들어 태그 모드인지, 아닌지 구분하게 하였습니다.

참고로 태그 모드란, '<' 를 만났고, '>'를 만나기 전 상태를 말합니다.

태그 모드가 아니라면, (flag = 0)
공백을 만난 경우 스택처럼 뒤에서 하나씩 출력해주면 됩니다.
그 외의 문자는 append 처리 해줍니다.

태그 모드인 경우 두 가지 케이스로 나뉘는데요.
여는 태그인 경우 flag 변수를 1로 설정한 뒤 deque에 담긴 문자열을 스택처럼 하나씩 뽑아 출력하면 됩니다.
(여는 태그 이전의 모든 문자를 역순으로 출력한다고 보시면 됩니다.)

닫는 태그인 경우, flag 변수를 0으로 만들고 deque에 담긴 문자열을 큐처럼 하나씩 뽑아 출력하면 됩니다.

태그와 태그 사이 문자는 그냥 deque에 append 합니다.
공백, 태그로 문자열이 종료되지 않는 경우를 위하여 코드 마지막 부분에 deque이 빈 상태가 아닐 때 까지 스택처럼 뒤에서 뽑아서 출력합니다.

공백, 태그로 문자열이 종료된 경우엔 deque가 비었기 때문에 코드가 실행되지 않을 것입니다.

from collections import deque

flag = 0
S = input()
stack = deque()

for i in S:

    # < 가 나오는 경우, 이전에 스택을 다 비워주고 > 만날 때 까지 스택에 쌓음

    if i == ' ': #공백을 만나는 경우

        if flag == 0:  # flag가 0이면 -> 모두 출력
            while stack:
                a = stack.pop()
                print(a, end='')
            print(i, end='')

        else:  # flag == 1인 경우, 괄호 모드이므로 일단 스택에 넣기.
            stack.append(i)

    elif i == '<':  # 앞에 있는 것들 모두 출력
        flag = 1
        while stack:
            a = stack.pop()
            print(a, end='')

        print(i, end='')

    elif i == '>':  # 닫는 괄호가 나오면 앞의 것부터 차례대로 출력한다.
        flag = 0
        while stack:
            a = stack.popleft()
            print(a, end='')
        print(i, end='')

    else: #단순한 문자열일 경우
        stack.append(i)

while stack:  # 남은 것들 모두 출력
    a = stack.pop()
    print(a, end='')
profile
만나서 반갑습니다.

0개의 댓글