코딩테스트

99클럽 코테 스터디 2일차 TIL : Scanner와 BufferedReader

kchabin 2025. 1. 15. 02:22

백준 : 그대로 출력하기 2

문제

입력 받은 대로 출력하는 프로그램을 작성하시오.

입력

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄이 주어질 수도 있고, 각 줄의 앞 뒤에 공백이 있을 수도 있다.

출력

입력받은 그대로 출력한다.

예제 입력 1 복사

    Hello

Baekjoon     
   Online Judge    

예제 출력 1 복사

    Hello

Baekjoon     
   Online Judge    

 

 

내 풀이

JAVA

  • EOF일 경우 null을 반환한다.
  • lineCount가 100을 넘거나 null이면(EOF 도달) 반복이 종료된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String line;
        int lineCount = 0;
        
        while((line = br.readLine())!=null && lineCount < 100){
            System.out.println(line);
            lineCount++;
        }
        br.close();
    }
}

https://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/

Scanner

입력받은 데이터를 다양한 타입으로 변환하여 반환

  • java.util 패키지의 일부
  • 원시형 타입과 문자열의 간단한 파싱
  • 파싱 오버헤드와 토큰화로 인해 퍼포먼스가 느려진다.
  • 버퍼 사이즈가 작다
  • non thread-safe
  • InputMismatchException
  • 퍼포먼스가 별로 중요하지 않은 콘솔 기반 애플리케이션에서 많이 활용하는 방식이다.
import java.util.Scanner;

public class Example {

    public static void main(String[] args)
    {
        Scanner s = new Scanner(System.in);
        System.out.print("Enter your name: ");
      
        String name = s.nextLine();
        System.out.print("Enter your age: ");
      
        int age = s.nextInt();
        System.out.println("Name: " + name
                           + ", Age: " + age);
        s.close();
    }
}

  • 다양한 데이터 타입을 지원한다 → nextInt(), nextDouble() 등을 활용할 수 있다.

BufferedReader

버퍼에 데이터를 한 번에 저장하고, 버퍼에서 데이터를 가져오는 방식

  • 성능이 중요할 때 사용
  • 큰 용량의 데이터 또는 파일을 읽을 때 효율적이다.
  • 한 번에 큰 청크의 데이터를 읽어들일 수 있다.
  • 텍스트를 읽을 때 사용된다.
  • String을 반환 → 형변환 필요 : Integer.parseInt(), Double.parseDouble() 등
  • thread-safe
  • IOException을 던진다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Example {
    public static void main(String[] args)
        throws IOException
    {
        BufferedReader r = new BufferedReader(
            new InputStreamReader(System.in));

        System.out.print("Enter your name: ");
        String name = r.readLine();

        System.out.print("Enter your age: ");
        int age = Integer.parseInt(r.readLine());

        System.out.println("Name: " + name
                           + ", Age: " + age);
    }
}

Kotlin

import java.io.*
import java.util.*

fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))) {
    
    var str: String?
    var line = 0
    
    while(readLine().also{ str = it }!=null && line < 100){
        println(str)
        line++
    }
    
}
  • scope function을 잘 활용하면 자바보다 간결하게 코드를 작성할 수 있다.
  • with : scope function
  • class Person { var name: String? = null var age: Int? = null } val person: Person = getPerson() print(person.name) print(person.age) //with : person의 중복 사용 제거 with(person) { print(name) print(age) }
  • also : 어떤 작업을 할때 다른 작업도 동시에 가능하도록 하는 scope function.
    • 문자열을 읽어오면서, 동시에 변수 할당도 한다.
  • 좀 더 간결하게 코드를 작성하려면 take() , forEach 를 사용할 수 있다.
fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
	readLines().take(100).forEach{ println(it) }
}
  • readLines() 는 모든 입력을 한 번에 읽고, 그 결과를 리스트 형태로 반환한다.
  • take() 함수는 Collection이나 Sequence에서 앞 부분의 특정 개수만큼 요소를 반환하는 함수이다. 주로 리스트나 문자열에서 처음 몇 개의 항목을 추출하는 데 사용된다.
  • 문제에선 최대 100줄로 이루어져있다고 했기 때문에, take(100)을 통해 100줄까지만 가져온다.