본문 바로가기

알고리즘/백준알고리즘

[백준 알고리즘/Python3] 17413 단어 뒤집기 2

문제 이해 

스택을 사용할 수 있고 문자열 자르기로 해결할 수 있습니다. 문자열 자르기로 해결해보려하다 코드가 너무 길어져서 다른 방법을 찾아봤습니다. 스택을 사용하는 방법도 있는데 파이썬으로 스택==리스트 라는 고정관념이 박혀있어서 너무 돌아가서 생각을 했습니다. 다른 분들의 풀이를 보니 문자열로 편하게 하는방법이 있었습니다😥

 

 

 

코드

import sys

text = list(sys.stdin.readline().rstrip())


flag = False # 정상 출력은 True
result = ''
stack = ''

#< ,' ' 만나기 전에는 전부다 스택에다가 넣어두고
#< 만나면 다른 스택에다가 넣어두고 
#> 만나면 스택이랑 합치면 된다.

for i in text:
    #뒤집어서 출력
    if flag == False:
        if i == '<':
            flag = True
            stack += i
        elif i == ' ':
            stack += i
            result += stack
            stack = ''
        else:
            stack = i + stack

    #정상적으로 출력    
    elif flag == True:
        stack += i
        if i == '>':
            flag = False
            result += stack
            stack = ''

print(result + stack)

문자열을 리스트로 만들고 for문을 돌립니다. 처음 문자열을 돌렸을 때 기본적으로 뒤집어서 출력을 해야합니다. 왜냐하면 <> 안에 있는 것들만 정상적으로 출력하면 되니깐요. stack문자열을 자세히보면 stack = 들어오는 문자 + 기존 문자 입니다. 이 방법으로 다른 뒤집는 연산 없이 들어오는 문자가 왼쪽으로 들어와서 자동으로 뒤집게 되는 것이죠

 

만약 뒤집는데 '<' 가 들어오면 flag=True로 만듭니다. 이제 stack 문자열에 오른쪽으로 들어오게 해야합니다. 그리고 '>' 문자가 나오면 다시 왼쪽으로 문자를 넣어야 하니 flag를 False로 만듭니다.

 

저는 띄어쓰기 부분에서 가장 애먹었습니다. 여기서는 띄어쓸 때, " " 공백은 stack 문자열 오른쪽에 넣어서 result 문자열 오른쪽에 합칩니다. 그리고 다시 왼쪽으로 넣어야 하니 빈 문자열로 만듭니다.

 

많은 시간을 고민했는 데도 버거워서 다른사람의 풀이를 보니 이해를 했습니다. 단순히 자료구조에 얽매이는게 언어의 특성을 잘 이용해야겠습니다.

728x90