백준/자료구조

[스택] 17413 : 단어 뒤집기 2

믕비 2023. 4. 11. 13:04
반응형

 

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

하나의 문자열을 탐색하며 <와 >의 끝을 불린함수로 표시해주었고 공백으로도 끊어줬다.

 

내 코드

메모리 : 23808 KB

시간 : 276 ms

코드 길이 : 1328 B

 

[내 코드]

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

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		Stack<Character> stack = new Stack<>();
		
		boolean isSpecial = false;
		String str = br.readLine();
		for(int i = 0; i < str.length(); i++) {
			if(str.charAt(i) == '<') {
				isSpecial = true;
				//<나오기 전의 문자열들을 뒤집어서 출력해줌
				while(!stack.isEmpty())
					sb.append(stack.pop());
				//< 넣어주기
				sb.append(str.charAt(i));
			}
			
			else if(str.charAt(i) == '>') {
				isSpecial = false;
				sb.append(str.charAt(i));
			}
			
			//<와 >의 사이에 존재하면 그대로 출력
			else if(isSpecial)
				sb.append(str.charAt(i));
			
			//<와 >의 사이가 아니면
			else if(!isSpecial) {
				//공백이면
				if(str.charAt(i) == ' ') {
					//거꾸로 출력해줌
					while(!stack.isEmpty())
						sb.append(stack.pop());
					sb.append(' ');
				}
				//공백이 아니면
				else
					stack.push(str.charAt(i));
			}
		}
		while(!stack.isEmpty())
			sb.append(stack.pop());
		
		System.out.print(sb);
	}

}

 

1등 코드

메모리 : 14200 B

시간 : 108 ms

코드길이 : 1119 B

 

[상위권 코드]

import java.io.*;

public class Main {
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    static char[] chars;
    public static void main(String[] args) throws Exception {
        chars = reader.readLine().toCharArray();

        int idx = 0;
        while (idx<chars.length) {
            if (chars[idx] == '<') {
                while(chars[idx++]!='>') {}
            } else if (Character.isLetterOrDigit(chars[idx])) {
                int start = idx;
                while (idx < chars.length && chars[idx] != '<' && chars[idx] != ' ') {
                    idx++;
                }
                int end = idx-1;
                reverse(chars, start, end);

                if(idx<chars.length && chars[idx]!='<') {
                    idx++;
                }
            }
        }

        System.out.println(chars);
    }

    static void reverse(char[] chars, int start, int end) {
        while (start<end) {
            char tmp = chars[start];
            chars[start] = chars[end];
            chars[end] = tmp;

            start++;
            end--;
        }
    }
}
반응형

'백준 > 자료구조' 카테고리의 다른 글

[백준] 10816 : 숫자카드2 (JAVA)  (1) 2025.04.14
[스택] 17299 : 오등큰수  (0) 2023.04.12
[스택] 17298 : 오큰수  (0) 2023.04.11
[백준] 스택 : 9093  (0) 2023.04.06
[백준] 큐 - 10845  (0) 2023.04.06