본문 바로가기
코딩테스트 준비/백준

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

by mwzz6 2025. 1. 14.

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

 

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


1.  아이디어

 

StringTokenizer와 StringBuilder의 조합으로 해결할 수 있다.


2. 문제풀이

 

태그 사이의 단어들은 그대로 태그 밖의 단어들은 역순으로 출력해야한다. 먼저 태그를 구분자로 하고 구분자까지 포함하는 StringTokenizer로 입력을 받았다. 토큰에서 열린 태그를 발견했을 경우 다음 토큰은 태그의 단어가 되고 그 다음 토큰은 닫는 태그가 되므로 총 3개의 토큰을 StringBuilder에 넣어줬다. 만약 토큰이 열린 태그가 아닌 경우 해당 토큰은 태그 밖 단어들이 되므로 다시 이 토큰을 공백을 구분자로 하는 StringTokenizer로 파싱한 후 StringBuilder의 reverse 메서드로 뒤집어서 넣어줬다. 기존 출력을 위한 StringBuilder와 구분해야하는 점에 주의해야 한다.


3. 코드

 

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine(), "<>", true);

        while (st.hasMoreTokens()) {
            String token = st.nextToken();

            if (token.equals("<")) {
                sb.append(token).append(st.nextToken()).append(st.nextToken());
                continue;
            }

            StringTokenizer st2 = new StringTokenizer(token, " ", true);
            while (st2.hasMoreTokens()) {
                sb.append(new StringBuilder(st2.nextToken()).reverse());
            }
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

4. 후기