파라미터로 값을 전달하여 사용하는 프로그래머스와 달리 백준은 입력 값을 통해 진행이 된다.
백준에서 JAVA로 입출력을 하는 방법과 입력 개수가 정해지지 않은 경우의 처리 방법에 대해 알아보겠다.
보통 백준의 예제 입력은 아래와 같은 형태를 가진다. 아래 예시를 통해 입출력 처리를 진행해 보자
3
4 5
2 6
3 4
1. Scanner로 입력 처리하기
Scanner를 사용한 입력 방법은 아래와 같다.
import java.util.Scanner; // Scanner import
public class Main {
public static void main(String[] args) {
// Scanner 선언
Scanner sc = new Scanner(System.in);
// 첫번째 라인 값 3 입력
int len = Integer.parseInt(sc.nextLine());
// 두번째, 세번째, 네번째 라인 값 split 사용, 공백 기준으로 입력
for(int i=0; i<len; i++) {
String[] arr = sc.nextLine().split(" ");
int sum = Integer.parseInt(arr[0]) + Integer.parseInt(arr[1]);
System.out.println(sum);
}
}
}
하나의 라인에 2개 이상의 입력 값이 들어온다면 split을 사용하여 해결하면 된다.
출력은 보편적인 방법인 System.out.print 를 사용하였다.
여기서 사용했던 Scanner는 속도가 느리고 대량의 입력 처리에는 적합하지 않으며, split으로 값을 나누는 방법 역시 속도가 느린 편이다. 출력을 할 때 사용한 System.out.print 또한 느린 편에 속한다. 보통 사용을 해도 문제는 없지만 시간제한 또는 메모리 제한이 있는 문제를 해결할 때는 로직은 맞더라도 속도가 느려 틀리는 경우가 발생할 것이다.
2. JAVA IO로 입출력 처리하기
앞서 진행했던 방식 대신 JAVA IO의 BufferedReader, BufferedWriter를 사용하여 빠르게 입출력을 구성해 보자
우선 속도가 느린 Scanner를 대신할 방안으로 BufferedReader를 사용하면 된다. 사용 방법은 아래와 같다.
import java.io.BufferedReader; // BufferedReader import
import java.io.InputStreamReader; // InputStreamReader import
public class Main {
// Exception 처리
public static void main(String[] args) throws Exception {
// BufferedReader 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedReader를 사용한 입력
int len = Integer.parseInt(br.readLine());
br.close();
}
}
참고로 JAVA IO를 사용할 때는 꼭 Exception 또는 try catch 처리를 해주자
다음으로 System.out.print 대신 출력을 처리할 땐 BufferedWriter를 사용하면 된다. 사용 방법은 아래와 같다.
import java.io.BufferedReader; // BufferedReader import
import java.io.BufferedWriter; // BufferedWriter import
import java.io.InputStreamReader; // InputStreamReader import
import java.io.OutputStreamWriter; // OutputStreamWriter import
public class Main {
// Exception 처리
public static void main(String[] args) throws Exception {
// BufferedReader 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedWriter 선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// BufferedReader를 사용한 입력
int len = Integer.parseInt(br.readLine());
br.close();
// BufferedWriter에 입력
bw.write(len+"\n"); // \n을 입력하여 줄바꿈
// 최종 출력
bw.flush();
bw.close();
}
}
System.out.print는 바로바로 출력이 되었지만 BufferedWriter는 write를 통해 하나하나 입력을 해주고 flush를 통해 입력이 되었던 모든 데이터가 한꺼번에 출력이 되는 형태이다.
마지막으로 split 대신 StringTokenizer를 사용하면 더 빠른 속도로 자를 수 있다. 사용 방법은 아래와 같다.
import java.io.*; // JAVA IO import
import java.util.StringTokenizer; // StringTokenizer import
public class Main {
// Exception 처리
public static void main(String[] args) throws Exception {
// BufferedReader 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedWriter 선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 첫번째 라인 값 3 입력
int len = Integer.parseInt(br.readLine());
// 두번째, 세번째, 네번째 라인 값 split 사용, 공백 기준으로 입력
for(int i=0; i<len; i++) {
// StringTokenizer를 이용한 공백 기준으로 자르기
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int sum = a + b;
bw.write(sum+"\n");
}
br.close();
// 최종 출력
bw.flush();
bw.close();
}
}
BufferedReader, BufferedWriter, StringTokenizer를 사용하면 향상된 속도로 입출력 처리를 할 수 있을 것이다.
앞으로 입출력을 처리할 땐 이 방법들을 꾸준히 사용해 주면서 터득하도록 하자.
추가로 입출력에 대해 처리 시간 비교를 백준님이 정리한게 있으니 참고하도록 하자
- 입력 시간 비교 (백준)
https://www.acmicpc.net/blog/view/56
- 출력 시간 비교 (백준)
https://www.acmicpc.net/blog/view/57
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 11718번 : 그대로 출력하기 - JAVA 풀이 (0) | 2024.07.31 |
---|---|
[백준] 10813번 : 공 바꾸기 - JAVA 풀이 (0) | 2024.07.29 |
[백준] 10810번 : 공 넣기 - JAVA 풀이 (0) | 2024.07.25 |