백준 : 그대로 출력하기 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줄까지만 가져온다.
'코딩테스트' 카테고리의 다른 글
99클럽 코테 스터디 4일차 TIL : reverse() (0) | 2025.01.16 |
---|---|
99클럽 코테 스터디 3일차 TIL : StringBuilder (0) | 2025.01.16 |
99클럽 코테 스터디 1일차 TIL + String 접근 방식 (0) | 2025.01.13 |
백준 2일차 - 2840번 (0) | 2022.07.05 |
백준 1일차 - 14681번, 2884번, 2525번 (0) | 2022.07.04 |