- 문제

- Dequq을 활용하여 구현하는 문제이다. Buffer을 통하여 명령 수를 입력 받고 if문을 통하여 조건 별로 Dequq 인터페이스에 내재되어있는 메소드를 활용하면 되는 간단한 문제이다.
- 그런데 출력쪽에서 문제가 생겼다.

- 출력 조건이 명령이 주어질 때마다, 한줄에 하나씩 출력해야 한다.
* 다시 말해, push_back 1과 push_front 2를 입력한 다음에 3번째 명령어인 front를 입력하면 바로 2가 출력되어야 하고 back을 입력하면 1이 바로 출력되어야 한다는 뜻이다.
- 여태 껏 풀었던 문제는 모든 명령어를 입력한다음 한번에 출력이 되는 방식이었기 때문에 이 부분에서 헤매었다.
- 처음 작성한 코드는 다음과 같다.
package _10866_Dequq;
import java.io.*;
import java.util.*;
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));
Deque<Integer> d = new LinkedList<>();
int n = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0; i<n; i++){
String com = br.readLine();
st = new StringTokenizer(com);
if(com.contains("push_front")){
st.nextToken();
d.addFirst(Integer.parseInt(st.nextToken()));
}
else if(com.contains("push_back")){
st.nextToken();
d.addLast(Integer.parseInt(st.nextToken()));
}
else if(com.equals("pop_front")){
if(!d.isEmpty()){
bw.write(d.removeFirst()+"\n");
}
else{
bw.write(-1+"\n");
}
}
else if(com.equals("pop_back")){
if(!d.isEmpty()){
bw.write(d.removeLast()+"\n");
}
else{
bw.write(-1+"\n");
}
}
else if(com.equals("size")){
bw.write(d.size()+"\n");
}
else if(com.equals("empty")){
if(d.isEmpty()){
bw.write(1+"\n");
}
else{
bw.write(0+"\n");
}
}
else if(com.equals("front")){
if(!d.isEmpty()){
bw.write(d.peekFirst()+"\n");
}
else{
bw.write(-1+"\n");
}
}
else if(com.equals("back")){
if(!d.isEmpty()){
bw.write(d.peekLast()+"\n");
}
else{
bw.write(-1+"\n");
}
}
else{
bw.write("잘못입력하셨습니다"+"\n");
}
}
bw.flush();
bw.close();
}
}
-> 이렇게 하면 모든 입력이 끝마쳐야 모든 결과가 한번에 출력된다.
- 새로 작성한 코드
package _10866_Dequq;
import java.io.*;
import java.util.*;
public class Practice {
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Deque<Integer> d = new LinkedList<>();
int n = Integer.parseInt(br.readLine());
StringTokenizer st;
for(int i=0; i<n; i++){
String com = br.readLine();
st = new StringTokenizer(com);
if(com.contains("push_front")){
st.nextToken();
d.addFirst(Integer.parseInt(st.nextToken()));
}
else if(com.contains("push_back")){
st.nextToken();
d.addLast(Integer.parseInt(st.nextToken()));
}
else if(com.equals("pop_front")){
if(!d.isEmpty()){
bw.write(d.removeFirst()+"\n");
bw.flush();
}
else{
bw.write(-1+"\n");
bw.flush();
}
}
else if(com.equals("pop_back")){
if(!d.isEmpty()){
bw.write(d.removeLast()+"\n");
bw.flush();
}
else{
bw.write(-1+"\n");
bw.flush();
}
}
else if(com.equals("size")){
bw.write(d.size()+"\n");
bw.flush();
}
else if(com.equals("empty")){
if(d.isEmpty()){
bw.write(1+"\n");
bw.flush();
}
else{
bw.write(0+"\n");
bw.flush();
}
}
else if(com.equals("front")){
if(!d.isEmpty()){
bw.write(d.peekFirst()+"\n");
bw.flush();
}
else{
bw.write(-1+"\n");
bw.flush();
}
}
else if(com.equals("back")){
if(!d.isEmpty()){
bw.write(d.peekLast()+"\n");
bw.flush();
}
else{
bw.write(-1+"\n");
bw.flush();
}
}
else{
bw.write("잘못입력하셨습니다"+"\n");
bw.flush();
}
}
bw.close();
}
}
- bw.write 밑에 bw.flush()를 추가하니까 출력이 하나씩 되었다.
* 물론 System.out.println() 을 bw.write 대신에 입력해주면 간단했으나 어떤 문제 같은 경우 for문에 println을 쓸 경우 시간 초과가 발생한적이 있어서 되도록이면 bufferedWriter나 Stringbulder을 통해서 한번에 출력하는 식으로 코드를 작성하고 싶었다.
- 이렇게 되는 이유가 무엇일까 갑자기 궁금해져서 자료를 찾아보았다.
-> BufferedWriter는 버퍼를 사용한다. 버퍼는 기본적으로 버퍼가 꽉 차기 이전에는 출력되지 않는다. 이떄 flush()를 활용하면 버퍼가 꽉차지 않아도 버퍼의 내용을 강제적으로 출력 후 버퍼를 비우는 과정을 거치게 된다.
다시말해 bw.wrtie("~~")와 같이 bw.write 메소드는 버퍼에 값을 입력하는 것이고 이를 출력하려면 flush() 메소드가 필요한 것이다. 모든 과정이 끝나면 close()을 통해 버퍼를 닫아줘야 데이터 공간의 낭비를 막을 수 있다고 한다.
'Algorithm' 카테고리의 다른 글
DFS (0) | 2022.02.12 |
---|---|
다이나믹 프로그래밍 (0) | 2022.01.27 |
알고리즘 기초 - 수학1 (0) | 2022.01.24 |
Deque(덱) (0) | 2022.01.19 |
Big-O 표기 (0) | 2022.01.17 |