문제 설명
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
문자열의 시작과 끝은 공백이 아니다.
'<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
예제 입력, 예제 출력
baekjoon online judge | noojkeab enilno egduj |
<open>tag<close> | <open>gat<close> |
<ab cd>ef gh<ij kl> | <ab cd>fe hg<ij kl> |
one1 two2 three3 4fourr 5five 6six | 1eno 2owt 3eerht rruof4 evif5 xis6 |
<int><max>2147483647<long long><max>9223372036854775807 | <int><max>7463847412<long long><max>7085774586302733229 |
<problem>17413<is hardest>problem ever<end> | <problem>31471<is hardest>melborp reve<end> |
< space >space space space< spa c e> | < space >ecaps ecaps ecaps< spa c e> |
코드 및 설명
import sys
s = list(sys.stdin.readline().strip())
s_arr = []
temp_str = ""
for i in range(len(s)):
if "<" == s[i]:
if len(temp_str) != 0:
s_arr.append(temp_str)
temp_str = ""
temp_str += s[i]
elif ">" == s[i]:
temp_str += s[i]
s_arr.append(temp_str)
temp_str = ""
elif " " == s[i]:
s_arr.append(temp_str)
s_arr.append(" ")
temp_str = ""
else:
if i == len(s)-1 and len(temp_str) != 0:
temp_str += s[i]
s_arr.append(temp_str)
else:
temp_str += s[i]
answer = []
check = False
len_s_arr = len(s_arr)
for i in range(len_s_arr):
for j in range(len(s_arr[i])):
if "<" == s_arr[i][j]:
check = True
if not check:
answer.append(s_arr[i][len(s_arr[i])-j-1])
else:
answer.append(s_arr[i][j])
if ">" == s_arr[i][j]:
check = False
print("".join(answer))
이 문제는 진짜 엄청 많이 고민했다. 힌트를 볼까 말까 고민 했는 데 결국 풀었다.
일단 첫번쨰 for문에선 예제가 들어오면
['baekjoon', ' ', 'online', ' ', judge]
['<open>', 'tag', '<close>']
['<ab', ' ', 'cd>', 'ef', ' ', 'gh', '<ij', ' ', 'kl>']
이런 형태를 갖게 하기 위해 작업을 했다. s에 문자열을 받고 s의 길이만큼 for 문을 돌려주는 데
"<" 이게 나왔을 땐 이 안에 있는 단어들은 뒤집어지면 안된다. < 나오면 temp_str에 값이 아무것도 없을 시 값을 그대로 쌓아주고, 만약 값이 있으면 먼저 배열에 넣어주고 그 다음 temp_str 초기화 해주고 다시 쌓기 시작
">" 여기선 뒤집지 않는 단어들의 끝이기 때문에 temp_str을 s_arr에 담아주고 temp_str를 초기화
" " 공백을 만나면 s_arr에 temp_str에 쌓아둔 것을 s_arr 담아주고 공백도 담아준다. 그 다음 temp_str를 초기화
그리고 i의 값이 len(s)-1의 길이와 같아질 때 temp_str이 비어있지 않다면 s_arr에 그 남은 값을 넣어준다.
위에 조건에 전부 해당되지 않으면 temp_str에 값을 더 해주기만 한다.
이게 끝나면 위에 배열들처럼 만들어지게 되는 데
이제 이중 for문을 이용하여, 단어를 뒤집을 것이다.
"<" 나오면 check=True로 바꿔주고 단어를 뒤집지 않고 answer에 저장
">" 나오면 chec= False로 바꿔주고 그 다음 단어부터는 뒤집어서 answer 저장
반복하면,
['n', 'o', 'o', 'j', 'k', 'e', 'a', 'b', ' ', 'e', 'n', 'i', 'l', 'n', 'o', ' ', 'e', 'g', 'd', 'u', 'j']
['<', 'o', 'p', 'e', 'n', '>', 'g', 'a', 't', '<', 'c', 'l', 'o', 's', 'e', '>']
['<', 'a', 'b', ' ', 'c', 'd', '>', 'f', 'e', ' ', 'h', 'g', '<', 'i', 'j', ' ', 'k', 'l', '>']
이러한 배열이 만들어진다. 여기서 "".join 하여 뿌려주면 정답이 나온다.
'삽집하는 개발들 > 알고리즘' 카테고리의 다른 글
[89일차][백준][수학, 사칙연산][1546]평균 (4) | 2023.12.06 |
---|---|
[88일차][백준][수학, 사칙연산, 구현][10430]나머지 (4) | 2023.12.05 |
[86일차][백준][자료구조, 덱][10866]덱 (5) | 2023.12.03 |
[86일차][백준][자료구조, 큐][1158]요세푸스 문제 (3) | 2023.12.03 |
[85일차][백준][자료구조, 큐][10845]큐 (3) | 2023.12.02 |