[백준] 17413 : 단어 뒤집기 2 - Python

조현수·2023년 5월 21일
0

알고리즘/백준

목록 보기
106/168
post-thumbnail

단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

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

알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
문자열의 시작과 끝은 공백이 아니다.
'<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다

출력

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

import sys
from collections import deque
sys.stdin = open("input.text", "rt")

i = 0
start = 0
data = list(input())
while i < len(data):
    if data[i] == "<": #열린 괄호 만나면
        i += 1
        while data[i] != ">":
            i += 1
        i += 1 #닫힌괄호까지는 그냥
    elif data[i].isalnum(): #숫자나 알파벳을 만나면
        start = i
        while i < len(data) and data[i].isalnum(): #아직 다 안돌았고, 숫자나 알파벳이라면
            i += 1
        #탈출 시 띄어쓰기 혹은 괄호를 만났어
        temp = data[start:i] #숫자나 알파벳인 지점을 받아온 후
        temp.reverse()
        data[start:i] = temp   #뒤집은 부분 바꿔치기
    else: #괄호도 아니고 숫자도 아니면 공백.
        i += 1 #그냥 증가

print("".join(data))
# for x in data:
#     print(x, end = "")

🎈 코멘트

괄호 사이의 문자열은 뒤집으면 안되기 때문에 "<"를 만나면 ">"를 만날 때까지 그대로 둔다. 알파벳이나 숫자일 경우, 뒤집어야 하기 때문에 단어를 구분짓는 공백이나, 혹은 괄호를 만나기 전까지 뒤집어준다.

  • 띄어쓰기 만나면 그냥 지나친다.
  • 핵심은 바꿔야 하는 부분만 따로 리스트로 뽑아낸 후 reverse() 후에 다시 기존 인덱스 부분과 바꿔치기를 하면 편했다.
profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글