시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 512 MB | 22599 | 12742 | 9824 | 56.600% |
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
a
'-'z
'), 숫자('0
'-'9
'), 공백(' `'), 특수 문자('
<', '
>`')로만 이루어져 있다.<
'와 '>
'가 문자열에 있는 경우 번갈아가면서 등장하며, '<
'이 먼저 등장한다. 또, 두 문자의 개수는 같다.태그는 '<
'로 시작해서 '>
'로 끝나는 길이가 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
함수부터 설명하면, 문제의 답으로 출력할 result
에 buffer
에 저장된 단어를 넣고 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를 합한 내용을 출력하면 정답으로 인정된다.