https://www.acmicpc.net/problem/17413
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
리니어 탐색을 하며 ' ' or '<' 가 나왔을 때 이전까지의 구간이 word인지 검사를 해줬다.
처음에 ' '에 의해 단어가 구별된다고 해서 ' '로 split을 하려고 했는데 ' '없이 '<'에 의해 단어가 종료될 수 있었다.
토큰화를 할 땐 마지막 토큰에 대해 처리를 잊게 되는 경향이 있다.
마지막에 word가 남아있었다면 뒤집어주는 처리를 추가했다.
# b - e 영역을 뒤집기
s[b:e] = s[b:e][::-1] # 가능
s[b:e] = reversed(s[b:e]) #가능
s[b:e] = s[b:e].reverse() #불가능
s = list(input())
istag = False
isword = False
b = -1
e = -1
for i in range(len(s)):
if s[i] == '<':
istag = True
if isword:
e = i
# b - e 영역을 뒤집기
s[b:e] = s[b:e][::-1]
isword = False
elif s[i] == '>':
istag = False
elif s[i] == ' ':
if isword:
e = i
# b - e 영역을 뒤집기
s[b:e] = s[b:e][::-1]
isword = False
else: # 알파벳/숫자
if not istag and not isword:# 새로운 단어의 시작
b = i
isword = True
#print(i,"".join(s),b,e,istag,isword)
if isword : # not istag는 어차피 >가 마지막엔 나오니까 무시
s[b:] = s[b:][::-1]
print("".join(s))