백준이 티어 시스템이 있어서 사람들이 많이 백준을 활용하여 알고리즘 풀이를 하고 있죠?
자바 원툴인 사용자들을 위해서 제가 삽질한 내용을 공유합니다.
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() 메소드를 통해 각 값들을 받아 주었습니다.
저는 백준을 본격적으로 푸는 것이 거의 처음이라, 이런 삽질도 해 보게 되는 것 같습니다. 제가 백준 시스템 안에서 직접 입출력을 디버깅해 볼 수 있다면 입출력 상 어떤 차이가 나는 것인지 볼 수 있겠지만, 그러지를 못해서 아쉽습니다.
다른 분들께서도 백준 입출력이 의심되실 때 한번 이용해 보시는 것도 좋을 것 같습니다.
혹시나 저렇게 해 주어야 하는 이유를 아시는 분 있으시다면 댓글 부탁드립니다!