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;
	}
}

댓글남기기