1 minute read

문제

#17413 단어 뒤집기2
Silver3
적용 알고리즘: X (String)


풀이 방법

  • 태그 안의 문자인지 태그 밖의 문자인지 구분하며 태그 안의 문자는 그대로 놔준다.
  • 단어를 뒤집는 함수를 생성한다.
  • 공백이나 열리는 태그를 만나면 단어가 끊기는 시점이다.
  • 태그 내부의 문자인지 외부의 문자인지 판단하는 flag 변수를 지정해준다.

코드 흐름

  1. 사용자에게서 문장을 입력 받는다.
  2. 태그의 내부/외부 여부 판단하기
    1. 한 문자씩 검사한다. 만일 “<”이면 태그가 열린다는 의미이다. open(태그 열림여부 판단 변수)의 값을 1로 변환해준다. 이는 또한 단어가 이전에 있었으면 단어의 끝이라는 의미이기도 하므로 만약 현재 진행되고 있었던 단어가 존재하면 이를 최종 문장에 (뒤집어서) 넣어준다.
    2. ”>”라면 open의 값을 0으로 설정하고, “>”를 최종 문장에 추가한다.
  3. 만약 open의 값이 1이라면(현재 글자는 tag 내부에 있음). 아무 변환이 필요 없으므로 현재 문자를 그대로 최종 문장에 추가한다.
  4. 만약 open의 값이 0이라면(현재 글자는 tag 외부에 있음). 단어의 끊김 여부를 판단한다. 만일 공백이거나, “<”를 만나거나, 현재 문자가 전체 문장에서의 마지막 문장이라면 단어를 뒤집어서 총 문장에 추가한다. 만일 공백으로 단어가 끊긴 것이라면 공백 문자를 따로 추가해준다. 단어(word)는 추가했으니 이를 초기화해준다.
  5. 만일 open의 값이 0이고 4번 케이스의 나머지 케이스라면 단어는 진행 중인 것이다. 해당 문자를 단어 변수(word)에 추가한다.
  6. 2~5의 과정을 모든 입력된 문장의 문자에 대해서 반복한다.
  7. 반복이 끝나고 만약 남아있는 단어가 있다면 이를 변형하여 총 문장에 추가해주고, 출력한다.

코드

def word_backward(text):
    temp = ""
    for i in range(len(text)):
        temp = text[i] + temp
    return temp


s = input()

sent = ""
word = ""
open = 0
for i in range(len(s)):
    if s[i] == "<":
        sent += word_backward(word)
        word = ""
        open = 1
    elif s[i] == ">":
        open = 0
        sent += s[i]

    if open == 1:
        sent += s[i]
                
    else:
        if s[i] == " " or s[i] == "<" or i - 1 == len(s):
            sent += word_backward(word)
            if s[i] == " ":
                sent += " "
            word = ""
        elif s[i] != ">":
            word += s[i]

if word != "":
    sent += word_backward(word)

print(sent)

체감 난이도: 3.9/5
쉽다고 생각했었는데 생각보다 푸는데 조금 걸렸던 문제이다… 조금 더 간결하게 할 수 있을 것 같은데.. 나중에 다시 시도해 봐야겠다.