Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 17413] 단어 뒤집기 2 (Java) 본문

Problem Solving

[BOJ 17413] 단어 뒤집기 2 (Java)

흑개 2022. 2. 13. 23:21

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

import java.util.Scanner;

public class P17413 {
	static int loc=0;
	static String s;
	static StringBuilder sb=new StringBuilder("");
	static StringBuilder temp=new StringBuilder("");
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		s=sc.nextLine();
		while (loc<s.length()) {
			if (s.charAt(loc)==' ') {
				sb.append(temp.reverse());
				temp=new StringBuilder("");
				sb.append(s.charAt(loc));
			}
			else if (s.charAt(loc)=='<') {
				if (temp.length()!=0) {
					sb.append(temp.reverse());
					temp=new StringBuilder("");
				}
				while (s.charAt(loc)!='>') {
					sb.append(s.charAt(loc));
					loc++;
				}
				sb.append(s.charAt(loc));
			}
			else {
				temp.append(s.charAt(loc));
			}
			loc++;
		}
		if (temp.length()>0) {
			sb.append(temp.reverse());
		}
		System.out.println(sb.toString());

	}

}

' '를 만나면 => 그간 저장해둔 문자열을 STtringBuilder의 reverse() 함수를 이용해서 붙여줌

'<'를 만나면=>그간 저장해둔 문자열이 있다면, reverse 해서 붙여주고 '>'를 만날때까지 위치 인덱스를 이동한다. 

그 외에는 모두 저장 문자열을 저장하는 변수에 문자를 저장한다.

 

그런데 이렇게 하면 실행 속도도 오래 걸린다.

다른 분들의 코드를 보니, stack을 이용하면 쉽게 풀 수 있다.

'<'를 만나면 스택에 저장해놓은 문자열을 프린트한다. FILO 구조이므로 저절로 reverse로 출력 가능하다.

그리고 boolean 값으로 true를 만들어, 현재 <> 속에 있음을 나타내고, <>가 있다면 문자 그대로 출력해준다. 

'>'를 만나면 false 를 만들어 문자 그대로 출력하는것을 멈춘다. 

 

' '를 만나면 스택을 출력해주고, 그 외에는 스택에 문자를 저장하는 형태이다.

 

스택을 이용해 reverse 하게 문자열이 출력되도록 했고, '<>' 가 있는 동안은 flag값을 이용해 문자를 그대로 출력하게 하는 방식이다