알고리즘/백준

백준 17413 : 단어 뒤집기 2 Java

코드 공작소 2023. 7. 18. 11:47
반응형

www.acmicpc.net/problem/17413


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 512 MB 5346 2856 2228 54.341%

문제

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와 같은 규칙을 지킨다.

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

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


입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.


출력

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.


제한


예제 입력

예제 출력

baekjoon online judge noojkeab enilno egduj
tag gat
ef gh fe hg
one1 two2 three3 4fourr 5five 6six 1eno 2owt 3eerht rruof4 evif5 xis6
21474836479223372036854775807 74638474127085774586302733229
17413problem ever 31471melborp reve
< space >space space space< spa c e> < space >ecaps ecaps ecaps< spa c e>

풀이 과정

 

스택을 사용해 문제를 풀었다. '<' 여는 태그가 나올 경우 '>'닫는 태그가 나오기 전까지 문자를 모두 출력해주며 아닐 경우 모두 스택에 넣는다. 그러다 공백을 만나게 된다면 스택에 있는 문자들을 모두 팝 하여 역순으로 출력하고 반복문이 끝날 경우 아직 남아있을 수 있는 문자를 처리하기 위해 한 번 더 출력 메서드를 실행한다.


Java 코드

import java.util.Scanner;
import java.util.Stack;

/* https://www.acmicpc.net/problem/17413
 * 단어 뒤집기 2
 * 스택 활용
 * '<' 를 만났을때 앞에있는 문자를 거꾸로 출력
 * */
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Stack st = new Stack();
		boolean flag = false;		//태그인지 아닌지 확인용
		
		String a = sc.nextLine();
		
		for (int i = 0; i < a.length(); i++) {	
			
			if (a.charAt(i) == '<') {		//태그 시작
				print(st); // < 검색시 태그 전까지 단어 뒤집기
				flag = true;
				System.out.print(a.charAt(i));
			} 
			else if (a.charAt(i) == '>') {	//태그 끝
				flag = false;	
				System.out.print(a.charAt(i));
			} 
			else if (flag) System.out.print(a.charAt(i));	//태그 안에있을경우 그냥 프린트해버리기
			else {
				if (a.charAt(i) == ' ') {		//공백을 만난다면 모두 팝
					print(st);
					System.out.print(a.charAt(i));
				}								
				else st.push(a.charAt(i));		//스택에 푸시
			}
		}
		print(st);
	}
		
		
	static void print(Stack st) {
		while (!st.empty()) {
			System.out.print(st.peek());
			st.pop();
		}
	}
}

 

반응형