(Python) 백준 17413

Lee Yechan·2023년 4월 3일
0

알고리즘 문제 풀이

목록 보기
17/60
post-thumbnail

백준 17413

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초512 MB2259912742982456.600%

문제

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

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

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

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

입력

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

출력

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


답안

import sys

buffer, result, char = '', '', ''
is_reversed = True

def flush():
    global result, buffer, char
    result += buffer + char
    buffer = ''

for char in sys.stdin.readline().rstrip():
    match char:
        case '<' | '>':
            flush()
            is_reversed = not is_reversed
        case ' ':
            flush()
        case _:
            buffer = char + buffer if is_reversed else buffer + char

print(result + buffer)

풀이

이 문제의 풀이는 운영체제, 컴퓨터 네트워크 등에서 사용되는 버퍼 개념에서 영감을 얻어 만들어졌다. 이 문제를 푼 방법을 간단히 설명하면, <, >, 공백(' ') 과 같은 문자들을 기준으로 문자열을 나눈 뒤, tag 안쪽에 위치한 문자열이라면 똑바로 버퍼에 저장하고, 바깥쪽에 위치한 문자열이라면 반대로 버퍼에 저장한 뒤, 그 버퍼의 내용을 result에 쓰는 것이다.

def flush():
    global result, buffer, char
    result += buffer + char
    buffer = ''

먼저 flush 함수부터 설명하면, 문제의 답으로 출력할 resultbuffer에 저장된 단어를 넣고 buffer를 비우는 것이다.

이 기능은 아래 많은 부분에서 사용되기 때문에 별도의 함수로 분리하였다.

for char in sys.stdin.readline().rstrip():
    match char:
        case '<' | '>':
            flush()
            is_reversed = not is_reversed
        case ' ':
            flush()
        case _:
            buffer = char + buffer if is_reversed else buffer + char

가장 핵심적인 코드이다.

입력 string에서 하나씩 문자(character)를 받아온 뒤,

  • 꺾쇠 문자 (< 또는 >)일 경우, 만약 문자가 거꾸로 버퍼에 저장되고 있었다면 제대로 버퍼에 저장되도록, 그리고 문자가 제대로 버퍼에 저장되고 있었다면 거꾸로 버퍼에 저장되도록 바꾼다.
  • 특수 문자 (<, >, 공백(' '))일 경우, 버퍼의 내용을 result에 쓴다(flush).
  • 특수 문자가 아닌 일반 문자일 경우, 문자를 똑바로, 또는 거꾸로 버퍼에 쓴다.

이렇게 한 뒤, result와 buffer를 합한 내용을 출력하면 정답으로 인정된다.

profile
이예찬

0개의 댓글