본문 바로가기

PROGRAMMING/ALGORITHM

[백준] 9093번 JAVA

2중 포문으로 구현

import java.io.*;
import java.util.Stack;

//stack 문자 뒤집기
//문제
//문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다.
//
//입력
//첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.
//
//출력
//각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다.
//
//실행과정 중 오류
//문장 전체를 뒤집어야 되는 줄 알고 구현, 
//메모리 초과가 나서 확인 해보니 단어 하나씩 뒤집는 것이 문제였음.

public class Main {
	public static void main(String args[]) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
		Stack<Character> stack = new Stack<>();
//		몇문장이 들어오는지 input수
		int nb = Integer.parseInt(reader.readLine());
		
		for(int i=0; i<nb; i++) {
			String input = reader.readLine();
			input += "\n";
			StringBuilder output = new StringBuilder();
			
			for(int j=0; j<input.length(); j++) {
//				빈칸&엔터가 아닌경우 stack에 넣는다
				if(input.charAt(j) != ' ' && input.charAt(j) != '\n' ) {
					stack.push(input.charAt(j));
				}else {
//				빈칸or엔터 일 경우 stack이 비워질때까지 writer에 담는다
					while(!stack.isEmpty()) { 
						output.append(stack.peek());
						stack.pop();
					}
					if(input.charAt(j) ==' ') {
						output.append(input.charAt(j));
					}
				}
			}
			writer.write(output.toString()+"\n");
		}
		reader.close();
		writer.flush();
		writer.close();
	}
}

3중 포문

import java.io.*;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

        int inputNum = Integer.parseInt(reader.readLine());
        StringBuilder sb = new StringBuilder("");

        for(int i=0; i<inputNum; i++) {
//            input loop
            String[] inputString = reader.readLine().split(" ");
            for(int j = 0; j < inputString.length; j++){
                Stack<String> chrStack = new Stack<>();
                String[] inputChar = inputString[j].split("");
                for(String chr : inputChar){
                    chrStack.push(chr);
                }
                while(!chrStack.isEmpty()){
                    sb.append(chrStack.pop());
                }
                sb.append(" ");
            }
            sb.append("\n");
        }

        writer.write(sb.toString());
        reader.close();
        writer.flush();
        writer.close();
    }
}

2중포문이 시간 + 메모리 모두 효율적

 

근데 다른분들 체점 한걸 보니 확실히 python이 빠르고 효율도 좋은것 같다.

파이썬으로 한번 짜봐야겠다.

'PROGRAMMING > ALGORITHM' 카테고리의 다른 글

[백준] 1158번 JAVA 요세푸스  (0) 2021.03.31
[백준] 1406번 JAVA  (0) 2021.03.30
[백준] 9012번 JAVA  (0) 2021.03.29
[백준] 9093번 Python  (0) 2021.03.28
[알고리즘] 빅 오 표기법  (0) 2021.03.17