본문 바로가기

공부/백준\BeakJoon

[BEAKJOON] 백준 17413번 : 단어 뒤집기 2

반응형

https://www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

 

문제

문제 설명

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

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

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

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

 

풀이 과정

괄호 사이의 문자열은 뒤집으면 안되기 때문에 "<" 를 만나면 ">" 를 만날 때 까지는 그대로 둔다.

알파벳이나 숫자일 경우, 뒤집어야 하기 때문에 단어를 구분짓는 공백이나, 혹은 괄호를 만나기 전까지 뒤집어준다.

 

처음에 이런식으로 진행해줬는데,

마지막 출력 때, 예외처리를 생각하지 못해서(괄호시에는 띄어쓰기 없음, 텍스트는 띄어쓰기 있음)

다시 짰다.

아래는 "틀렸습니다"의 내 삽질이다.

공백처리를 못해줬다.

text = input().strip()

result_list = []

i = text
a = i.find('<')
b = i.find('>')
if(a == -1):
    for j in i.split():
        result_list.append(j[::-1])
else:
    while(a != -1):
        if(a == 0):
            result_list.append(i[:b+1])
            i = i[b+1:]
        else:
            if(a == -1):
                for j in i.split():
                    result_list.append(j[a-1::-1])
            else:
                for j in i[:a:].split():
                    result_list.append(j[a-1::-1])
            i = i[a:]
        a = i.find('<')
        b = i.find('>')
print("".join(result_list))

 

옳은 정답

인덱스를 변경시켜주는건데, 이거를 하면 시간이 더 오래될 것 같아서 아이디어는 생각했지만, 넘어갔었다.

그러나 아래 코드는 정답은 아닌 것 같은데, 이렇게 푸는 방법도 있다.

이런!

import sys
input = sys.stdin.readline

text = list(input().strip())

i = 0

while i < len(text):
    if(text[i] == '<'):
        while(text[i] != '>'):
            i += 1
        i += 1
    elif(text[i] == ' '):
        i += 1
    else:
        start = i
        while i < len(text) and text[i].isalnum():
            i += 1
        tmp = text[start:i]
        text[start:i] = tmp[::-1]
print("".join(text))

 

반응형