반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [백준 알고리즘] 백준 17413번 단어 뒤집기 2 자바(Java)

1) 문제번호 : 17413번

 

2) 문제 출처

www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

2. 문제

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

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

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

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

3. 제약사항

4. 입력

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

5. 출력

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

 

6. 풀이

- 문자열을 거꾸로 출력하는 것은 Stack을 활용하면 된다.

- 그리고, 태그 안과 밖을 구분하는 boolean형 변수를 하나 만들어서 태그 안에 있으면 true, 밖이면 false로 둔다.

- 먼저, '<'이 오면 Stack에 저장되어 있는 것들을 먼저 다 출력한다. Stack이 빌 때까지.

- '>'이 오면 그대로 출력

- 태그 안에 있으면 문자열을 그대로 출력

- 태그 밖에 있으면서 공백이 오면 스택에 있는 것들을 빌 때까지 pop하여 출력하고, 공백이 아니면 스택에 push를 한다. 

 

7. 소스 코드

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine();
		Stack<Character> stk = new Stack<>();
		
		//<> 안에 안에 있는지 밖에 있는지 구분
		//안이면 true, 밖이면 false
		boolean inout = false;
		
		//S를 하나씩 탐색
		for (int i = 0; i < S.length(); i++) {
			//'<'이게 오면 
			if (S.charAt(i) == '<') {
				inout = true; // 태그 안
				
				//스택에 저장되어 있는거를 다 pop하면서 출력
				while (!stk.isEmpty()) {
					System.out.print(stk.pop());
				}
				
				//'<'기호 표시
				System.out.print(S.charAt(i));
			}
			
			//'>' 이게 오면
			else if(S.charAt(i)=='>') {
				inout = false;
				System.out.print(S.charAt(i));
			}
			
			// <>안에 있으면
			else if(inout) {
				//순서 그대로 출력
				System.out.print(S.charAt(i));
			}
			
			// <>밖에 있으면
			else if(!inout) {
				//공백이라면
				if(S.charAt(i)==' ') {
					//스택에 저장되어 있는거를 다 pop하면서 출력
					while (!stk.isEmpty()) {
						System.out.print(stk.pop());
					}
					
					//공백 출력
					System.out.print(S.charAt(i));
				}
				
				//공백이 아니면
				else {
					//스택에 넣기
					stk.push(S.charAt(i));
				}
			}
		}
		
		//나머지 스택에 저장되어 있는거를 다 pop하면서 출력
		while (!stk.isEmpty()) {
			System.out.print(stk.pop());
		}
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기