백준/자료구조

[백준] 스택 : 9093

믕비 2023. 4. 6. 21:09

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

 

9093번: 단어 뒤집기

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는

www.acmicpc.net

입력을 어떻게 해야 할지 굉장히 헤맸다.

stack을 사용해야 하는 건 알겠는데 한 줄을 반대로 하는 게 아니라 단어를 반대로 해야 하는 거여서 어떻게 끊을지 고민함.

끝에 '\n'를 추가한 한 줄을 모두 String으로 입력한 후에 Character 타입의 스택에 ' '와 '\n'를 만나면 모두 pop 아니면 push를 해주며 반복했다.

 

메모리 : 72032 KB

시간 : 720 ms

코드길이 : 915 B

 

[내 코드]

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb;
		
		int T = Integer.parseInt(br.readLine());
		for(int t = 0; t < T; t++) {
			sb = new StringBuilder();
			String str = br.readLine() + '\n';
			Stack<Character> stack = new Stack<>();
			for(int i = 0; i < str.length(); i++) {
				if(str.charAt(i) == ' ' || str.charAt(i) == '\n') {
					while(!stack.empty()) {
						sb.append(stack.pop());
					}
				sb.append(" ");
				}
				else
					stack.push(str.charAt(i));
			}
			bw.write(sb + "\n");
		}
		bw.close();
		
	}

}

1등 코드

메모리 : 24732 KB

시간 : 200 ms

코드 길이 : 765 B

 

[상위권 코드]

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	public static void main(String[] args) {
		/*int test = '\n';
		System.out.println((char)test+":"+test);*/ // => 결과: 10
		char[] stack = new char[20];
		int top=0;
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		try {
			// int n = Integer.parseInt(br.read()); 는 사용불가
			// br.read()가 이미 int(ascii char형)를 반환하기 때문에. 그렇다고 그냥 br.read() 출력하면 숫자의 ascii값을 출력해준다.
			int n = Integer.parseInt(br.readLine());
			for(int i=0; i<n; ++i) {
				int c;
				while(true) {
					c = br.read();
					// 띄어쓰기 만나면 출력
					if(c == ' ' || c == '\n') {
						while(top != 0) {
							bw.write(stack[--top]);
						}
						// 스택 출력 후에 띄어쓰기랑 뉴라인 버퍼에 저장
						if(c == ' ') bw.write(' ');
						if(c == '\n') {
							bw.write('\n'); 
							break;
						}
					} else if(c == '\r') {
						// @ 윈도우에서 개행은 캐리지리턴(CRLF, \r\n)이다!
					}else {
						// 스택에 띄어쓰기, 뉴라인 전부 넣으면 띄어쓰기부터 시작함(스택)
						stack[top++] = (char)c;
					}
					// System.out.println((char)c + ":" + c); // => 결과: 문장 끝에 13
					
				}
			}
			bw.flush();
		} catch(Exception e) {
			e.printStackTrace();
		}

	}

}

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

[스택] 17413 : 단어 뒤집기 2  (0) 2023.04.11
[스택] 17298 : 오큰수  (0) 2023.04.11
[백준] 큐 - 10845  (0) 2023.04.06
[백준] 스택 - 1406  (0) 2023.04.05
[백준] 스택 - 10828  (0) 2023.04.05