10816 숫자 카드2 문제를 풀다가 시간 복잡도를 만났다.
시간 복잡도를 생각해서 Collections.sort()
로 정렬도 했고, 이진탐색으로 검색도 했는데 무엇이 문제였을까?!
바로 Scanner를 사용했기 때문이다.
그래서 이번 시간에는 간단하게 버퍼(Buffer)가 무엇인지 알아보고, 버퍼로 입출력을 해보겠다.
버퍼는 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 데이터를 보관하는 메모리 영역을 말한다. 보통 데이터는 키보드와 같은 입력장치로부터 받거나, 출력 장치로 내보낼 때 버퍼 안에 저장된다.
버퍼는 고정값이 아니라 가변적인 값을 받는다. 또한 버퍼는 입력받는 값을 버퍼에 저장해두고, 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 전송한다.
이렇게 "한 번에 전송하는 것"은 프로그램 실행 속도를 증가시킨다. 예를들어, 우리가 A에서 B로 5개의 물건을 배달할 때, 한개씩 배달하는 것보다 한번에 배달하는 것이 빠르기 때문이다.
다만 사용 시 주의할 점도 있다.
엔터를 경계로 인식하고, String으로 받아오므로 형변환을 해야 한다.
public class Main {
public static void main(String[] args) throws IOException { // 예외처리
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String string = br.readLine();
int i = Integer.parseInt(br.readLine()); // 형변환
}
}
System.out.println("");
처럼 출력한다. 역시 버퍼에 담을 때 형변환을 해야한다.write()
를 통하여 쓰고, flush()
함수로 버퍼에 담아있는 데이터를 출력하여 없앤다.
public class Main {
public static void main(String[] args) throws IOException { // 예외처리
BufferedWriter bw = new BufferedReader(new OutputStreamWriter(System.out));
bw.writer("a");
bw.newLine();
bw.write("b" + " " + "c");
bw.newLine("\n");
bw.write("d");
bw.flush();
bw.close();
}
}
/*
a
b c
d
*/
BufferedReader 라인으로 읽어온 입력값을 Input으로 이용할 때 공백에 맞춰 Split한다. 이때 문자열을 토큰으로 바꿔서 풀이하는 StringTokenizer를 사용하는 방법을 알아보겠다.
// 띄어쓰기를 기준으로 나눔
StringTokenizer st = new StringTokenizer(문자열);
// 구분자를 기준으로 나눔
StringTokenizer st = new StringTokenizer(문자열, 구분자);
public class Main {
public static void main(String[] args) throws IOException {
String str = "a b c";
StringTokenizer st = new StringTokenizer(str);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
}
/* 출력
a
b
c
*/