본문 바로가기
  • 저희는 평생 개발할 운명이걸랑요
오늘의 코드/진욱찌

04.05 오늘의 알고리즘 문제(9093: 단어 뒤집기)

by 김해닳 2021. 4. 5.

혜송님이 문제를 여러가지 올려주셨는데

 

그 중에서 오늘은 자료구조 탭에 있는 9093-단어 뒤집기 문제를 풀어보았습니다!

'뒤집어 출력한다'에 초점을 맞추자!

 

다른 부분보다 저는 '단어를 뒤집어 출력한다'는 점에 초점을 맞춰서

처음에는 입력 받은 문장을 Split으로 공백을 기준으로 잘라서 저장한 후에

뒤집어서 출력하는 방식으로 코드를 작성 하기로 했습니다.

 

<1차 시도- 시간초과>

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

public class Algo9093 {

	public static void main(String[] args) throws IOException{
		BufferedReader BufferR=new BufferedReader(new InputStreamReader(System.in));
		int TestCase = Integer.parseInt(BufferR.readLine());

		for (int i = 0; i < TestCase; i++) {
			String WordInput = BufferR.readLine();
			String[] WordArr = WordInput.split(" ");

			for (String Word : WordArr) {
				for (int j = Word.length() - 1; j >= 0; j--) {
					System.out.print(Word.charAt(j));
				}
				System.out.print(" ");
			}
			System.out.println();
		}
		BufferR.close();
	}

}

Buffer를 이용해서 최초 for문에서 입력받은 문장을 Split으로 잘라서 저장 한 후에

 

문장 배열의 마지막 부분(저 코드로 보면은 Word.lenngth()-1 부분이겠죠?)부터 반복문을 돌리면서 출력시켰습니다.

 

......

 

근데 문제는 이렇게 코드를 작성 했더니

 

이때까지만 해도 좋았다....

 

이런식으로 이클립스에서는 정상적으로 출력이 되는데......

 

 

아니 어째서?!?!?!?

백준에서는 시간 초과가 났습니다....

 

아무래도 코드를 읽어오는 과정에서 불필요한 코드 때문에 시간이 오래 걸리는 것 같더라구요...

 

혹시나 싶어서 Scanner를 사용해서 다시 짜봤더니 역시나....(애초에 Buffer에서 시간초과면.....)

 

가장 기초적인 방법으로 코드를 짰더니 시간초과가 나서

 

'시간을 줄이면서 간단하게 짤 수 있는 방법이 없을까' 생각을 하다가

 

기존에 기초문제를 풀면서 Stack에 대해서 공부한 적이 있어서

 

'Stack에 있는 pop을 이용해서 공백 제외 문자를 스택에 담아서 찍어볼까...?'라는 생각을 하고

 

이번에는 Stack을 이용해서 코드를 작성 해봤습니다.

 

<2차 시도 - 시간 초과>

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

public class Algo9093 {

	public static void main(String[] args) throws IOException {
		BufferedReader BufferR = new BufferedReader(new InputStreamReader(System.in));
		int TestCase = Integer.parseInt(BufferR.readLine());
		for (int i = 0; i < TestCase; i++) {
			String WordInput = BufferR.readLine() + "\n";
			Stack<Character> Stack = new Stack<Character>();
			for (int j = 0; j < WordInput.length(); j++) {
				if (WordInput.charAt(j) == ' ' || WordInput.charAt(j) == '\n') {
					while (!Stack.isEmpty()) {
						System.out.print(Stack.pop());
					}
					System.out.print(WordInput.charAt(j));
				} else {
					Stack.push(WordInput.charAt(j));
				}
			}
		}

	}
}

 Stack을 이용해서 공백이 나올때 까지의 문자를 스택에 담아서 출력 시켰습니다.

 

오늘 공부하면서 처음 알았는데 거꾸로 출력 시킬 방법이 뭘지 고민 해봤는데

 

Stack은 그냥 출력 시킬 때 담아두었다가 꺼내면은 자동으로 거꾸로 출력이 된다고 하더라구요

 

놀라워라....

 

아....이런.....

그런데 아니나 다를까....

 

또 시간초과 오류가 났습니다....

 

이 때쯤 되니 이제 슬슬 정신이 멍해지더라구요.....

 

뭘 어째야 되나 머리를 굴리고 굴리다가 '출력을 System.out.print로 하지 말고 BufferedWrite로 찍어보자...' 

 

라는 생각까지 하고 다시 코드를 짰습니다....

 

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

public class Algo9093 {

	public static void main(String[] args) throws Exception {
		BufferedWriter BufferW=new BufferedWriter(new OutputStreamWriter(System.out));
		BufferedReader BufferR = new BufferedReader(new InputStreamReader(System.in));
		int TestCase = Integer.parseInt(BufferR.readLine());
		Stack<String> Stack = new Stack<>();
		
		for (int i = 0; i < TestCase; i++) {
			String WordInput = BufferR.readLine();
			for (int j = 0; j < WordInput.length(); j++) {
				if (WordInput.charAt(j) == ' ') {
					while (!Stack.isEmpty()) {
						BufferW.write(Stack.pop());
					}
					BufferW.write(" ");
				} else {
					Stack.add(WordInput.charAt(j)+"");
				}
			}
			while(!Stack.isEmpty()) {
				BufferW.write(Stack.pop());
			}
			BufferW.write('\n');
		}
		BufferR.close();
		BufferW.flush();
	}
}

위에서 짠 코드랑 크게 달라진건 없습니다. 다만 출력을 BufferedWrite로 받았을 뿐이었구요.

 

진짜 마지막 희망이라는 생각을 가지고 출력을 시켜봤습니다.

 

....

 

그런데

 

??????

...............어?? 문제에서 요구하는 대로 입력이랑 출력이 되네요??

 

?????????????????????????????????

..........어?! 맞았네요.............?!

 

아.....왜 그걸 생각 못했을까.....

네.....결정적으로 BufferedReader를 쓴것까지는 좋았는데

 

BufferedWriter.....그걸 쓸 생각을 못해서 지금까지 이 고생을 한겁니다....

 

위 짤 처럼 정말 어이가 없었군요.....

 

앞으로는 BufferedWriter를 쓰는 습관을 들이자....라는 걸 생각하면서

 

오늘의 알고리즘을 마칩니다.....

댓글