본문 바로가기
Problem Solving/BOJ

[BOJ][Python]17413번 풀이

by NoiB 2022. 7. 27.
반응형

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

import sys
ssr = sys.stdin.readline

s = ssr().rstrip()
tmp = ''
state = 0
idx = 0
ans = []
for i in range(len(s)):
    if s[i] == '<':
        idx = i
        state = 1
        if tmp != '':
            ans.append(tmp[::-1])
    elif s[i] == '>':
        state = 0
        ans.append(s[idx:i+1])
        tmp = ''
    elif s[i] == ' ' and state != 1:
        ans.append(tmp[::-1]+' ')
        tmp = ''
    else:
        tmp += s[i]
if tmp != '':
    ans.append(tmp[::-1])
print(''.join(ans))

이제는 실버3 구현으로 넘어왔습니다. 사실 구현 문제는 워낙 많고 표시 티어에 비해 난이도가 어렵다는 특징이 있어서 브5부터 전부 다 풀면서 올라오는 것은 꽤 힘든 작업인데요. 그래서 저는 현재 티어 -5를 한 난이도를 풀고 있습니다. 그러면 딱히 레이팅이 많이 오르지 않으면서 적당히 머리를 쓸 수 있어서 적당한 것 같더라구요. 다만 언젠가 클래스 10까지 다 풀게 되면 그 때는 어떻게 할지 잘 모르겠습니다. 구현 안에서 랜덤으로 풀 것 같기도 하네요.

 

문제 접근은 일반적인 문자열 갖고놀기라고 생각하시면 될 것 같습니다. 구현 문제의 특징상 많은 사람들이 다 다르게 풀기 때문에 뭐 이런 풀이도 있구나 생각하시면 될 것 같아요. 저는 보통 이렇게 반복문 안에서 어떤 조건에 의해서 저장하고 안하고를 가려야 하는 경우 항상 상태를 나타내는 state라는 변수를 선언해주는 편입니다(흔히들 flag라고 쓰는 변수와 하는 일이 비슷하겠네요. 다만 저는 flag는 다른 용도로 사용하기 때문에 state라고 정의합니다). 해당 문제의 경우 부등호 내부의 문자열을 뒤집으면 안되기 때문에 < 이게 나오면 state를 변경해서 저장을 합니다. 이렇게 하는 이유는 부등호 안에서 공백이 주어지는 경우가 있기 때문입니다. 해당 문제에서는 공백도 구분자로 쓰이므로 함부로 모든 공백이 나올 때 마다 뒤집어서 저장을 했다간 원하는 결과가 나오지 않겠죠. > 이게 나오면 이제 뒤집어도 되는 state로 다시 변경을 해주면 되니까요. 해당 문제에서 입력은 10^5까지로 O(n)의 알고리즘이면 문제 없이 돌아가기에 바로 반복문으로 작성했네요.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]1991번 풀이  (0) 2022.07.29
[BOJ][Python]1932번 풀이  (0) 2022.07.28
[BOJ][Python]1629번 풀이  (0) 2022.07.27
[BOJ][Python]1149번 풀이  (0) 2022.07.26