2021. 8. 19. 13:45ㆍ코딩/Python
내 사고과정
어떻게 빠르게 출력 결과를 나타낸다는 거지? 감이 오지 않았다.
- 백준 사이트에 올라온 Tip을 보니, 내가 이제까지 사용해왔던 Scanner 클래스, System.out.println() 보다는 BufferedReader, BufferedWriter (+BufferedWriter.flush)를 사용하는 게 좋다고 한다.
BufferedReader와 BufferedWriter은 사용이 익숙하지 않아서(사용해 본 적이 없어서) 구글링을 참고하였다.
버퍼를 사용해서 읽고 쓰는 함수
버퍼를 이용하기 때문에 이 함수를 사용하면 입출력의 효율이 좋아진다.
근데, 오히려 버퍼를 사용하는 게 더 효율성이 떨어지는 게 아닌가?
키보드에 바로 입력해서 전달하는게 더 빠를 것 같다고 생각했는데 아니었다.
Buffer(임시 저장공간)을 한 번 거쳐가는게 더 빠른 이유는?
- 하드디스크는 원래 속도가 엄청 느리다. 하드 뿐만 아니라 키보드, 모니터와 같은 외부 장치와의 데이터 입출력은 생각보다 시간이 걸리는 작업. 버퍼링 없이 키보드가 눌릴 때마다 눌린 문자의 정보를 바로 이동시키는 것보다 중간에 메모리 버퍼를 둬서 데이터를 한 데 묶어서 전송하는게 더 효율적이고 빠르다.
그냥 키보드에서 바로 눌린 대로 전송하게 되면 CPU와 성능 갭이 많이 발생하여 비효율적이다.
버퍼가 꽉 차게 되면 자동으로 flush를 이용하여 버퍼를 비워준다 = AutoFlush
BufferedReader = Scanner 클래스
BufferedWriter = System.out.println()
둘은 많은 양의 데이터를 처리할 때 유리하다 (버퍼를 거쳐 데이터가 전달되므로 효율성 증가)
BufferedReader은 Enter만 경계로 인식하고 / 받은 데이터들은 String으로 고정되기 때문에 입력 받은 데이터를 가공하는 작업 필요하다. (형변환)
이들을 사용하기 위해서 import문에 선언
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
내 실행코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Test {
public static void main(String[] args) {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine(); // 원래 BufferedReader은 String 형으로 데이터타입이 고정되어 있다.
int num = Integer.parseInt(bf.readLine()); // String 형이었던 s를 num 변수로 이름 바꾸고, Integer형으로 형변환 한다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num1 = num;
bw.write(num1);
bw.flush(); // 비움
bw.close(); // BufferedWriter 닫기
}
}
내 실행결과
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Unhandled exception type IOException
Unhandled exception type IOException
Unhandled exception type IOException
Unhandled exception type IOException
Unhandled exception type IOException
at Test.main(Test.java:9)
IOException 예외처리가 안되어있다고 한다.
수정 실행 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException; // throw를 이용하기 위해 import문 선언
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Test {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int a = Integer.parseInt(br.readLine());
for(int i=0;i<a;i++) {
st = new StringTokenizer(br.readLine());
bw.write((Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken()))+"\n");
// readLine() 이용 시 리턴값을 String으로 고정되기에 String이 아닌 다른 타입(Int)으로 입력을 받으려면 형변환 필요
// Read한 데이터는 Line 단위로만 나눠지기에 공백단위로 데이터를 가공하려면 따로 작업 필요. StringTokenizer에 nextTocken()함수를 쓰면
// readLine()을 통해 입력받은 값을 공백 단위로 구분하여 순서대로 호출 가능
}
bw.close(); // BufferedWriter의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush() / close()를 호출해주어 뒤처리를 해주어야 한다.
}
}
StringTokenizer()은 긴 문자열을 지정된 구분자를 기준으로 문자열 슬라이싱
토큰이 최소의 단위이니 토큰 단위로 쪼개준다.
실행 결과
3 >> 테스트 케이스 개수
1 1
2 2
3 3
2
4
6
'코딩 > Python' 카테고리의 다른 글
백준 2742 - java ) 기찍N (0) | 2021.08.24 |
---|---|
백준 2741 - java ) N찍기 (2) | 2021.08.20 |
백준 8393 - java ) 합 (0) | 2021.08.19 |
백준 10950 - java ) A+B-3 (0) | 2021.08.18 |
백준 2739 ) 구구단 (java) (2) | 2021.08.18 |