본문 바로가기
🧑‍💻코딩 테스트/백준 (BOJ)

[백준 알고리즘/Java] BOJ.9093 : 단어 뒤집기

by 코코의 주인 2022. 7. 14.

문제

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

 

9093번: 단어 뒤집기

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

www.acmicpc.net

 


입출력 (BufferedReader, BufferedWriter, InputStreamReader, OutputStreamWriter)

public class BOJ_9093 {
    public static void main(String[] args) throws IOException {	//사용 시 예외처리 필수!!

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        int num = Integer.parseInt(br.readLine());	//형변환

        OutputStreamWriter osw = new OutputStreamWriter(System.out);
        BufferedWriter bw = new BufferedWriter(osw);

주로 입력 시에는 Scanner을 주로 사용했지만, 입력이 큰(많은) 경우 효율이 떨어진다는 단점이 있다. 

BufferedReader와 BufferedWriter는 버퍼를 이용해서 입출력의 효율을 높이는 역할을 한다. 손으로 하나씩 나르던 것을 버퍼라는 트럭을 이용해서 한방에 나른다고 이해하면 된다.

 BufferedReader의 readLine() 메서드를 사용하면 데이터를 라인 단위로 읽을 수 있다. 하지만 리턴값이 String이기 때문에 형 변환이 필요한 경우가 있다. 위의 예제에서는 만약 2가 입력으로 들어갔다고 하면 이것을 숫자 2가 아니라 문자열 "2"로 반환하기 때문에 정수형으로 형변환 해주었다.

 

구현

        while(num-- > 0) {	//num개의 입력
            String str = br.readLine() + "\n";	//줄바꿈 추가
            Stack<Character> s = new Stack<>();
            for(char ch : str.toCharArray()) {	//문자열을 문자형 배열로 변환
                if(ch == ' ' || ch == '\n') {
                    while(!s.isEmpty()) {
                        bw.write(s.pop());
                    }
                    bw.write(ch);
                }
                else {
                    s.push(ch);
                }
            }
        }
        bw.flush();	//버퍼 비우기
    }
}

 

for 문에 ':' 가 들어간 건 처음 써본다. JDK 1.5 이상부터 지원하는 향상된 for문을 사용한 것이다. 배열과 컬렉션에 저장된 요소에 접근할 때 사용하면 아주 유용하다. 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 선서대로 읽혀서 변수에 저장된다. 앞으로 알고리즘을 풀면서 유용하게 사용할 듯 하다.

toCharArray() 메서드가 아주 효자다. 문자열을 char형 배열로 자동으로 바꿔준다. 만약 저게 없었다면 charAt()을 써서 문자열 끝까지 한 글자씩 불러오는 식으로 반복문을 구현했을 거 같다.


코드

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

public class BOJ_9093 {
    public static void main(String[] args) throws IOException {

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        int num = Integer.parseInt(br.readLine());

        OutputStreamWriter osw = new OutputStreamWriter(System.out);
        BufferedWriter bw = new BufferedWriter(osw);

        while(num-- > 0) {
            String str = br.readLine() + "\n";
            Stack<Character> s = new Stack<>();
            for(char ch : str.toCharArray()) {
                if(ch == ' ' || ch == '\n') {
                    while(!s.isEmpty()) {
                        bw.write(s.pop());
                    }
                    bw.write(ch);
                }
                else {
                    s.push(ch);
                }
            }
        }
        bw.flush();
    }
}

총평

 딱 보면 알겠지만 내가 짠 코드가 아니다ㅎㅎ

 그럼에도 불구하고 정리를 하는 이유는 자바로 코딩테스트를 이제 막 준비한 입장에서 굉장히 좋은 공부가 되었기 때문이다.

 아직 자바가 많이 낯설다. 처음 보지만 유용한 메서드가 많아서 열심히 공부 중이다. 내가 생각한 방법은 많은 코드를 접하면서 익히는 것이기 때문에 앞으로 한동안은 이런 식의 글이 종종 올라올 듯 하다.

댓글