공부하기/백준

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

XEV 2023. 6. 9. 23:56

자바 백준 17413번

실버 3

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

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 구현, 자료 구조, 문자열, 스택

 

 

 

 

 

문제 풀기

StringBuilder 를 이용하여 순서 그대로 유지해야할 < > 의 묶음과 순서를 뒤집어야할 묶음을 저장할 변수를 지정한다.

넓은 범위에서 분기는 <> 유무인 Tag 의 상태로 지정한다. "< >" 는 inTag 로 지정하여 시작 "<" 에 대해서는 inTag 를 True 로 지정하고 그 이후의 문자들을 순차적으로 저장한다. 닫히는 ">" 가 나타나면 inTag 를 False 로 변환 후 저장된 문자들을 유지한다.

이후에 들어오는 문자들은 뒤집어야 하는 문자이므로 지속적으로 저장하되, "<" 또는 " "(빈칸) 이 나오면 그 임시저장된 문자열을 reverse() 를 통해 뒤집은후 storedString 에 추가한다. 이때 "<" 이 나오면 태그 시작 형태로 진행하고 " "(빈칸) 이 나오면 다시 뒤집을 문자를 임시저장한다.

끝날때에는 "< >" 를 보장하지 않으므로 저장된 남은 문자열이 있으면 뒤집은 후 추가하고 마무리한다.

 

 

 

 

 

코드 보기

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        String S = sc.nextLine();  // 입력 문자열
        
        String result = reverseWords(S);  // 주어진 규칙에 의해 문자 뒤집기
        
        System.out.println(result);  // 결과 출력
    }
    
    public static String reverseWords(String S) {
        // StringBuilder 로 문자를 누적 저장
        StringBuilder storedString = new StringBuilder();  // 결과 반환을 위한 문자열
        StringBuilder word = new StringBuilder();  // 뒤집기 위해 저장된 단어
        
        boolean inTag = false;  // < > 로 감싸진 상태 태그로 판별

        // 주어진 문자열에서 하나씩 확인
        for (int i = 0; i < S.length(); i++) {
            char c = S.charAt(i);  // 문자 임시 저장
            
            // 입력된 문자 또는 inTag 에 따른 분류
            if (c == '<') {
                storedString.append(word.reverse());  // 태그 시작으로 지금까지 저장된 단어 뒤집어 저장
                word.setLength(0);  // 저장된 단어 초기화
                storedString.append(c);  // '<' 저장
                inTag = true;  // 태그 시작 표시
            } else if (c == '>') {
                storedString.append(c);  // '>' 저장
                inTag = false;  // 태그 끝 표시
            } else if (inTag) {
                storedString.append(c);  // 태그 안에 포함된 문자 그대로 저장
            } else if (c == ' ') {
                storedString.append(word.reverse());  // 빈칸으로 단어가 나뉘는 순간 지금까지 저장된 단어 뒤집어 저장
                storedString.append(c);  // ' ' 빈칸 저장
                word.setLength(0);  // 저장된 단어 초기화
            } else {
                word.append(c);  // 위의 경우를 모두 만족하지 않은 상태로 뒤집힐 예약 단어 저장
            }
        }
        
        storedString.append(word.reverse());  // 마지막에 뒤집을 단어가 있을경우 저장
        
        return storedString.toString();
    }
    
}