[Baekjoon] 17413번 : 단어 뒤집기2
1. 문제
https://www.acmicpc.net/problem/17413
- 구현 문제
// 문제
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
알파벳 소문자('a'-'z'), 숫자('0'-'9'),
공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
문자열의 시작과 끝은 공백이 아니다.
'<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며,
'<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고,
'<'와 '>' 사이에는 알파벳 소문자와 공백만 있다.
단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고,
연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며,
태그와 단어 사이에는 공백이 없다.
// 입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
// 출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
// 예제 입력 1
baekjoon online judge
// 예제 출력 1
noojkeab enilno egduj
// 예제 입력 2
<open>tag<close>
// 예제 출력 2
<open>gat<close>
// 예제 입력 3
<ab cd>ef gh<ij kl>
// 예제 출력 3
<ab cd>fe hg<ij kl>
// 예제 입력 4
one1 two2 three3 4fourr 5five 6six
// 예제 출력 4
1eno 2owt 3eerht rruof4 evif5 xis6
// 예제 입력 5
<int><max>2147483647<long long><max>9223372036854775807
// 예제 출력 5
<int><max>7463847412<long long><max>7085774586302733229
// 예제 입력 6
<problem>17413<is hardest>problem ever<end>
// 예제 출력 6
<problem>31471<is hardest>melborp reve<end>
// 예제 입력 7
< space >space space space< spa c e>
// 예제 출력 7
< space >ecaps ecaps ecaps< spa c e>
2. 핵심 아이디어
- 문자열을 어떻게 처리할지 고민
3. Python 문제풀이
import sys
input = sys.stdin.readline
s, tmp = input().rstrip(), ''
ck = False
ans = ''
for i in s :
if i == ' ' :
if not ck :
ans += tmp[::-1] + ' '
tmp = ''
else :
ans += ' '
elif i == '<' :
ck = True
ans += tmp[::-1] + '<'
tmp = ''
elif i == '>' :
ck = False
ans += '>'
else :
if ck :
ans += i
else :
tmp += i
ans += tmp[::-1]
print(ans)
4. Java 문제풀이
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Stack<Character> stack = new Stack<Character>();
int check = 0;
String s = sc.nextLine();
StringBuilder ans = new StringBuilder();
for (char ch : s.toCharArray()) {
if (ch == '<') {
check += 1;
while (!stack.isEmpty()) {
ans.append(stack.pop());
}
ans.append("<");
} else if (ch == '>') {
check-=1;
ans.append(">");
} else if (ch == ' ') {
while (!stack.isEmpty())
ans.append(stack.pop());
ans.append(" ");
} else {
if (check == 0)
stack.push(ch);
else
ans.append(ch);
}
}
while (!stack.isEmpty())
ans.append(stack.pop());
System.out.println(ans);
sc.close();
return;
}
}
댓글남기기