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

gramm·2021년 8월 1일
0

알고리즘 문제 리뷰

목록 보기
35/36

출처: 백준 온라인 저지

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



📃 문제 설명

알파벳 소문자, 숫자, 공백 문자, 특수 문자('<', '>')로 이루어진 문자열 S가 주어진다.

주어진 문자열 S를 공백 단위로 뒤집는다.

입력: baekjoon online judge

출력: noojkeab enilno egduj

단, '<'으로 시작해 '>'로 끝나는 문자열은 태그로, 뒤집지 않는다.

입력: <ab cd>ef gh<ij kl>

출력: <ab cd>fe hg<ij kl>

처음에는 split() 메서드를 통해 공백 단위로 나누는 방식을 생각했다. 하지만 태그 사이에 공백이 있는 경우를 처리하기 어려웠다.

다음으로는 '<'와 '>'의 인덱스를 저장한 뒤, 반복문을 돌면서 태그 부분은 그대로, 태그 바깥 부분은 뒤집어서 이어 붙이는 방식을 생각했다. 하지만 이 경우에도 다양한 예외를 처리하기 어려웠다.


🔑 문제 해결 과정

결국 혼자 힘으로 풀기를 포기하고 다른 사람들의 코드를 참고하기로 했다.

다른 사람들의 코드를 보니, 대체로 문자열의 각 문자를 순회하면서 '<', '>', 공백 문자, 그 외인 경우를 if문으로 분기하여 처리했다. 그래서 나도 일단 이러한 방식으로 풀이하고자 했다.

문자가 '<', '>', 공백 문자, 그 외인 경우 해야 하는 일을 정리하면 다음과 같다.


문자위치해야 하는 작업
'<'그 동안 저장한 문자열을 뒤집어 새 문자열에 이어붙인다.
'>''<' 에서부터 저장한 문자열을 새 문자열에 이어붙인다.
공백 문자(' ')태그 안공백 문자를 저장한다.
태그 바깥그 동안 저장한 문자열을 뒤집은 뒤, 공백 문자를 붙여 새 문자열에 이어붙인다.
알파벳/문자문자열을 임시로 저장한다.

그리고 이렇게 정리한 내용을 최대한 그대로 구현했더니 쉽게 풀 수 있었다.


🔓 최종 풀이


from sys import stdin


S = stdin.readline().rstrip()

"""
temp_word: 임시로 저장하는 문자열
reversed_word: 뒤집기를 완료한 문자열 (인쇄할 값)
is_in_tag: 현재 순회중인 값이 태그 내에 있다면 True, 아니라면 False
"""
temp_word = ""
reversed_word = ""
is_in_tag = False

for char in S:
    if char == '<':
        reversed_word += temp_word[::-1]
        temp_word = '<'
        is_in_tag = True
    elif char == '>':
        reversed_word += temp_word
        reversed_word += '>'
        temp_word = ''
        is_in_tag = False
    elif char == ' ':
        if is_in_tag:
            temp_word += ' '
        else:
            reversed_word += temp_word[::-1]
            reversed_word += ' '
            temp_word = ''
    else:
        temp_word += char

reversed_word += temp_word[::-1]

print(reversed_word)

배운 점 1 : 문제가 복잡해 보일 때는 최대한 문제를 더 작은 문제로 나누고 도식화하기

배운 점 2 : 문제를 단번에 해결해주는 기발한 풀이법보다는, 복잡하더라도 확실한 방법을 찾기

profile
I thought I introduced

0개의 댓글