본문 바로가기
고래밥의 삽질일기/백준

[백준 Java] 자바 입력 BufferedReader 사용

by 개발자만타 2022. 12. 30.

백준이 티어 시스템이 있어서 사람들이 많이 백준을 활용하여 알고리즘 풀이를 하고 있죠?

 

자바 원툴인 사용자들을 위해서 제가 삽질한 내용을 공유합니다. 

 

BOJ 1002 : 터렛

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

 

 맨 처음에는, BufferedReader 의 readLine 을 이용해서 한 번에 받아준 뒤, split 을 하는 방법으로 입력을 받아주면 된다고 생각하고 문제를 풀었습니다. 

 

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

        for(int i = 0; i < inputCase; i++){
            int[] array = getInputAsArray(br.readLine().split(" "));
            playGame(array[0],array[1],array[2],array[3],array[4],array[5]);
        }
    }

    static int[] getInputAsArray(String[] inputAsStringArray){
        int[] intArray = new int[inputAsStringArray.length];
        for(int i = 0; i < intArray.length; i++){
            intArray[i] = Integer.parseInt(inputAsStringArray[i]);
        }
        return intArray;
    }

하지만 이렇게 했을 때 BOJ 1002 번에서 계속 오답이 등장하였고, 로직이 잘못된 줄 알았습니다. 하지만 다른 분들의 해답과 비교해 보아도 로직이 다른 부분이 하나도 없었기에, BufferedReader 의 입력을 의심했습니다.

 

결국 다른 분의 백준 상의 Java 입력 코드를 보고 문제를 해결했습니다.

 

아래는 제가 찾은 올바른 자바에서의 입력 예시입니다.

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

        for(int i = 0; i < inputCase; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int x1 = Integer.parseInt(st.nextToken());
            int y1 = Integer.parseInt(st.nextToken());
            int r1 = Integer.parseInt(st.nextToken());
            int x2 = Integer.parseInt(st.nextToken());
            int y2 = Integer.parseInt(st.nextToken());
            int r2 = Integer.parseInt(st.nextToken());
            playGame(x1,y1,r1,x2,y2,r2);
        }
    }
 }

맨 위의 숫자 하나는, 그냥 br.readLine() 이후 Integer.parseInt 로 변환해서 받아주었습니다.

이후의 숫자들은, StringTokenizer 를 통해 받으며 " " delimiter 로 구분해서 받아준 모습입니다. 

이후에는, StringTokenizer 의 nextToken() 메소드를 통해 각 값들을 받아 주었습니다.

 

저는 백준을 본격적으로 푸는 것이 거의 처음이라, 이런 삽질도 해 보게 되는 것 같습니다. 제가 백준 시스템 안에서 직접 입출력을 디버깅해 볼 수 있다면 입출력 상 어떤 차이가 나는 것인지 볼 수 있겠지만, 그러지를 못해서 아쉽습니다.

다른 분들께서도 백준 입출력이 의심되실 때 한번 이용해 보시는 것도 좋을 것 같습니다.

 

혹시나 저렇게 해 주어야 하는 이유를 아시는 분 있으시다면 댓글 부탁드립니다!

 

출처 : https://st-lab.tistory.com/90