백준 15552번 빠른 A+B
Python에서 Java로 언어를 바꾸고 처음부터 연습중인 백준 알고리즘,, 무난하게 풀다가 이상한 문제에 가로막힘..
문제를 보고 든 생각은, 입출력 방식을 빠르게 하려면 Scanner 보다 BufferedReader을 사용해야겠구나! 라고 단순히 생각하고 문제에 접근하려고 했었다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class main {
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(input.readLine());
StringTokenizer stz;
for (int i = 0; i < num; i++) {
stz = new StringTokenizer(input.readLine()," ");
int a = Integer.parseInt(stz.nextToken());
int b = Integer.parseInt(stz.nextToken());
System.out.println(a+b);
}
}
}
그 결과로 이런 코드를 완성했고, 이클립스에서도 완벽하게 잘 돌아가는것을 확인하고 뿌듯하게 제출했는데...
시간초과... (?) 이때까지만 해도 Scanner 안쓰고 BufferedReader 잘 사용했는데 뭐가 문제지.. 라고 혼자 계속 고심하다가.. 구글링을 시작했다... (혼자 못풀겠어... 내가 아는 지식 총 출동했던 문제였는데..)
구글링 해본결과 시간을 줄이려면
- StringBuilder 로 하나의 문자열로 계속 연결시킨 뒤 가장 마지막에 연결된 하나의 문자열을 출력시키는 방법.
- BufferedWriter 로 버퍼에 담아둬았다가 한 번에 데이터를 보내는 방법
크게 이렇게 2가지 방법이 있는데 첫 번째 방법은 아예 본적도 없는 개념이라서 이왕 푸는거 알고 있는 개념으로 응용해보자 생각하고 두 번째 방법을 선택하고 다시 코드를 짜봤다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// 오케이
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int j = 0; j < N; j++) {
st = new StringTokenizer(br.readLine()," ");
bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()))+ "\n");
}
br.close();
bw.flush();
bw.close();
}
}
BufferWriter로 버퍼에 담아뒀다가 데이터를 한방에 보내줌으로 시간을 줄일 수 있었다.
15552번 문제로 인해서 BufferedReader, StringBuilder, BufferedWriter의 3개의 개념에 대해서 조금 깊숙하게 공부해봤는데
코딩은 공부하면 공부할수록 정말 꼼꼼하고 세세하게 따져서 완성해야겠구나를 느꼈다..
데이터의 양이 많아지면 많아질수록 이러한 시간 단축이 프로그램의 질을 높히는 아주 큰 요소가 될 듯 싶다.
[백준] 문제 풀때마다 참고하는 블로그인데 너무 상세하게 잘 설명해주셔서 매번 감사히 도움을 받는다...
[백준] 15552번 : 빠른 A+B - JAVA [자바]
https://www.acmicpc.net/problem/15552 15552번: 빠른 A+B 첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다...
st-lab.tistory.com