본문 바로가기

소프트웨어/Java

[Java] 반복문 return시 BufferedWriter 사용하지 않으면 출력 안되는 이유

https://www.acmicpc.net/problem/2501

 

2501번: 약수 구하기

첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

www.acmicpc.net

 

bw.flush() : 남아있는 데이터를 모두 출력시키는 메소드

 

백준 2501번 문제 약수 구하기 문제를 풀던 중 결과값이 출력되지 않았습니다. 

작성한 코드가 출력되지 않은 이유는  반복문 return전 bw.flush()을 사용하지 않았기 때문입니다. 

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));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken()); // 몇번째 약수?
        int q = 0;
        int count = 0;

        for(int i=1; i<=N; i++){
            if(N%i == 0){
                count++;
                if(count==K){
                    bw.write(String.valueOf(i));
                    return; // 종료
                }
            }
        }

        bw.write(String.valueOf(0));
        bw.flush();
        br.close();
        bw.close();
    }
}

 

버퍼를 비우지 않으면 출력이 안되는 이유는 내부적으로 데이터가 버퍼에만 저장되어 있기 때문입니다. 컴퓨터 시스템에서는 효율성을 위해 출력 작업이 실제로 발생하는 시점을 조절하기 위해 작은 양의 데이터를 출력할 때에도 시스템은 일정량의 데이터를 모아서 한꺼번에 출력하려고 합니다. 그렇기 때문에 데이터를 출력하는 프로그램에서는 일정량의 데이터가 버퍼에 쌓이면 이를 실제로 출력하는데, 그 전까지는 버퍼에 저장된 데이터가 외부로 전달되지 않습니다.

 

하지만 해당 코드는 K번째 약수를 바로 출력하고 반복문을 종료하기에 버퍼에 쌓인 데이터를 즉시 출력해야 하는 예제입니다. 

이런 경우에는 flush() 메소드를 호출하여 버퍼를 비워서 즉시 출력할 수 있습니다. 그렇지 않으면 프로그램이나 파일이 종료될 때까지 데이터가 버퍼에 남아 있게 되어 출력되지 않습니다.

 

 

 

반복문 안에 bw.flush()를 하니까 이제 출력이 잘되는걸 볼 수 있습니다. 

 

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));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken()); // 몇번째 약수?
        int q = 0;
        int count = 0;

        for(int i=1; i<=N; i++){
            if(N%i == 0){
                count++;
                if(count==K){
                    bw.write(String.valueOf(i));
                    bw.flush(); // 버퍼 비우기 (이유 : 비우지 않으면 내부적으로 데이터가 버퍼에만 저장되어 있기 때문에 출력이 안됨)
                    return; // 종료
                }
            }
        }

        bw.write(String.valueOf(0));
        bw.flush();
        br.close();
        bw.close();
    }
}

 

 

 

 

참고 https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com