출처: 백준 온라인 저지
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 : 문제를 단번에 해결해주는 기발한 풀이법보다는, 복잡하더라도 확실한 방법을 찾기