[백준 17413] 단어뒤집기2

klean·2021년 5월 27일
0

문제

https://www.acmicpc.net/problem/17413
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

아이디어

리니어 탐색을 하며 ' ' or '<' 가 나왔을 때 이전까지의 구간이 word인지 검사를 해줬다.

처음에 ' '에 의해 단어가 구별된다고 해서 ' '로 split을 하려고 했는데 ' '없이 '<'에 의해 단어가 종료될 수 있었다.

실수

토큰화를 할 땐 마지막 토큰에 대해 처리를 잊게 되는 경향이 있다.
마지막에 word가 남아있었다면 뒤집어주는 처리를 추가했다.

새로 배운 것

list의 부분 뒤집기

# 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))

0개의 댓글