본문 바로가기
Algorithm

백준 17413번 <단어 뒤집기 2>

by seungh2 2020. 8. 28.

백준 알고리즘 17413번

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

백준 9093번 <단어 뒤집기>의 업그레이드버전???!!!

<단어 뒤집기>와 <단어 뒤집기 2> = 브론즈 1과 실버 3ㅎㅎ


17413번

입력으로 주어지는 문자열에서 태그와 단어를 구분해서 태그는 그대로 단어만 뒤집어서 출력한다.

태그는 공백과 알파벳 소문자로 이루어져있고 단어는 알파벳 소문자와 숫자로 이루어져있다.

 

처음에는 <에디터>문제에서 배운! StringTokenizer를 사용해서 태그와 단어를 구분하려고 했는데\

태그에 공백이 존재할 수 있어서 불가능!!!!


문제 해결

그래서! input에 입력받은 문자열을 저장하고 while문을 돌렸다!

결과를 저장할 StringBuffer result 사용.

 

1.  input의 첫번째 글자가 <이면  -> 태그!

   <의 index와 >의 index를 구해서 태그부분을 잘라서 태그를 result에 넣어준다.

   그리고 input에서 태그를 잘라낸다.

   만약 input에서 태그를 잘라내고서 길이가 0이면 break.

2. input의 첫번째 글자가 <이 아니면 -> 단어!

   1)  index를 0으로 초기화하고   

   2) while문을 한 번 더 돌린다.

      - index와 input의 길이가 같으면 break. (마지막 단어!)

      - charAt으로 index번째의 글자를 얻는다.

      - 만약 그 글자가 '<'이거나 ' '이면 break. (단어가 끝났으니까!)

      - 그 글자를 stack에 넣는다.

      - index에 +1을 해준다. (다음 글자를 봐야하니까!)

   3) stack의 크기만큼 for문을 돌려서 stack에서 꺼내서 result에 넣어준다.

   4) index랑 input의 길이가 같으면 break. (마지막 단어!)

   5) 만약 input의 index번째 글자가 ' '이면 result에 " "를 넣어주고 index+1

   6) input에서 index를 이용해 result에 저장한 단어를 잘라준다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuffer result = new StringBuffer();

		String input = br.readLine();
		int length = input.length();

		Stack<Character> stack = new Stack<Character>();

		while (true) {
			if (input.charAt(0) == '<') {
				int open = input.indexOf("<");
				int close = input.indexOf(">");
				String temp = input.substring(open, close + 1);
				input = input.substring(close + 1, length);
				length = input.length();
				result.append(temp);
				if (length == 0) {
					break;
				}

			} else {
				int index = 0;
				while (true) {
					if (index == length) {
						break;
					}
					char addChar = input.charAt(index);
					if (addChar == '<' || addChar == ' ') {
						break;
					}
					stack.add(addChar);
					index++;
				}
				int size = stack.size();
				for (int i = 0; i < size; i++) {
					result.append(stack.pop());
				}
				if (index == length) {
					break;
				}
				if (input.charAt(index) == ' ') {
					result.append(" ");
					index++;
				}
				input = input.substring(index, length);
				length = input.length();

			}

		}

		System.out.println(result.toString());

	}

}


728x90

'Algorithm' 카테고리의 다른 글

백준 10926번 <??!>  (0) 2020.08.29
백준 9095번 <1, 2, 3 더하기>  (0) 2020.08.28
백준 17298번 <오큰수>  (0) 2020.08.27
백준 1158번 <요세푸스 문제>  (0) 2020.08.26
백준 10845번 <큐>  (0) 2020.08.26

댓글