(Java) 백준 17413번 - 단어 뒤집기 2

코딩너구리·2026년 3월 4일

코딩 문제 풀이

목록 보기
245/266

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

문제

> 문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
> 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

> 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
> 문자열의 시작과 끝은 공백이 아니다.
> '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또,  문자의 개수는 같다.

> 태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, 
'<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 
> 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고,
연속하는 두 단어는 공백 하나로 구분한다. 
> 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

접근

태그와 단어를 구별해주는게 가장 중요한 과제이다.
'<'가 들어오면 태그 시작이므로 태그가 시작됐다고 boolean으로 flag역할을 해준다.
또 '<'일땐, 중간에 나왔을 경우엔 직전에 단어들이 있을 수 있으므로 지금까지 스택에 쌓인 단어를 출력하도록 해줘야한다.
'>'라면 태그가 끝났으므로 flag를 반전시킨다.
이제 flag에 따라서 스택에 쌓을지 그냥 출력할지 가린다.

문제해결

> str에 문자열을 입력받고 flag용 boolean변수 tag를 false로 선언한다.
> 단어를 담아 뒤집을 스택 s를 선언한다.
> 입력받은 문자열을 각 자리별로 보며 '<'가 나오면 스택에 있는 단어를 역순으로 출력한다.
> 만약 없다면(시작부터 태그라면) 출력이 없다.
> 태그 시작이므로 tag를 true로 바꿔주고 문자를 그대로 출력한다.
> '>'라면 태그가 끝났으므로 >를 출력하고 tag를 false로 바꿔 단어를 입력받는다.
> 이제 tag에 따른 상태처리이다.
> false 즉, 단어를 받는상태라면, 스택에 문자를 넣는다.
> 하지만 공백일 때도 지금 까지 저장된 문자를 출력해야하므로 이를 처리해준다.
> tag가 true면 태그 문자라는 상태이므로 그대로 문자를 출력해준다.
>for문이 끝나고 마지막으로 단어가 나왔을 경우를 위해 스택에 원소가 있나 확인하고 있다면 출력한다.

코드

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

public class Main {
    //17413번 단어 뒤집기2
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        String str = br.readLine();
        boolean tag = false;
        Stack<Character> s = new Stack<>();
        for(int i = 0; i < str.length(); i++) {
            if(str.charAt(i) == '<') {
                if(!s.isEmpty()) while(!s.isEmpty()) sb.append(s.pop());
                tag = true;
                sb.append(str.charAt(i));
                continue;
            }
            if(str.charAt(i) == '>') {
                sb.append(str.charAt(i));
                tag = false;
                continue;
            }
            if(!tag) {
                if(str.charAt(i) == ' ') {
                    while(!s.isEmpty()) sb.append(s.pop());
                    sb.append(' ');
                }
                else s.push(str.charAt(i));
            }
            if(tag) sb.append(str.charAt(i));
        }
        while(!s.isEmpty()) sb.append(s.pop());
        System.out.print(sb);
    }
}

후기

분기나누는게 꾀 까다로웠다. 스택 기능자체는 간단했는데 문자열 다루는 문제는 좀 복잡하다.

0개의 댓글