먹었으면 뇌를 쓰자

[java] 입력값 클래스 Scanner, BufferedReader (백준 1단계) 본문

JAVA/백준 알고리즘

[java] 입력값 클래스 Scanner, BufferedReader (백준 1단계)

뇌이비 2022. 10. 24. 21:02

백준 1단계를 풀다보니

 

아니 정확히 말하자면

남의 알고리즘을 구경하다보니

 

Scanner와 BufferedReader를 공부해야 할 것 같다.

 

 

 

Scanner

 

스트림(Stream)은 데이터 입출력이 진행되는 단방향 도로이다.

자바의 표준 입력 스트림은 InputStream 이다.

자바에 내장된 Scanner 클래스는

InputStream을 실현하는 System.in을 사용해 입력값을 받는다.

 

import java.util.Scanner;

Scanner sc = new Scanner(System.in);

int a = sc.nextInt();
String s = sc.nextLine();

 

1. 자바 내장 클래스니까 import 삽입하기

2. 객체를 만들어 입력값을 받도록 도로 개통하기

3. 도로로 실려오는 데이터의 타입 정하기

(단, String은 설명하기 복잡한 내부적 이슈로 nextLine()으로 실려와야 한다)

 

 

백준 3003 체스말 문제처럼 여러 개의 입력값을 받을 때는

for문을 이용하는 것 같다.

 

import java.util.Scanner;

Scanner sc = new Scanner;

for(int i=0; i<6, i++){          // i<6, 즉 6개의 입력값이 들어올 수 있다.
	int input = sc.nestInt();
    System.out.print(input);
    }

 

이 외에도 sc.close(); 로 Scanner를 종료시켜야 하는데,

굳이 적지 않아도 실행이 끝나면 자동 종료되는 것 같다.

 

 

 

 

 

BufferedReader

 

입력값을 받는 기능은 Scanner와 동일하다.

하지만 입력값을 도로에 바로 싣는 게 아니라

한 번 버퍼링을 걸어주고 실어보낸다.

많은 양의 입력이 필요할 때 사용한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	public static void main(String[]args) throws IOException {

	BufferdReader br = new BufferdReader(new InputStreamReader(System.in));

	int i = Integer.parseInt(br.readLine());
	String s = br.readLine();
  }
}

 

1. 반드시 예외 처리를 해줘야 한다. 메소드 옆에 throws IOException 을 달아준다.

2. InputStream 그냥 사용이 안되나보다. new InputSreamReader(System.in)으로 해줘야 한다.

3. readLine()은 String 값만 반환되기에 다른 데이터 타입은 변환을 해줘야 한다.

 

 

 

 

3번 제약 때문에 데이터를 가공하는 경우가 많이 발생한다.

이 때 사용되는 가공 방법이 StringTokenizer 메소드이다.

 

StringTokenizer()는 readLine()을 통해 받은 입력값을 공백 단위로 구분해 순서대로 호출한다.

String.split()은 배열을 공백 단위로 끊어서 순서대로 호출한다.

 

public class Main{
	public static void main(String[]args) throws IOException {

	BufferdReader br = new BufferdReader(new InputStreamReader(System.in));
	StringTokenizer st = new StringTokenizer(br.readLine());

	int i = Integer.parseInt(st.nextToken());

	//String.split()은 다음과 같이 사용한다
	String st[] = br.readLine().split(" "); 

  }
}

 

 

 

BufferedReader로 받은 입력값은 BufferdWriter로 출력할 수도 있다.

 

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

String s = "출력하려는 값";
bw.write(s+"\n");
bw.flush();
bw.close();

// int 값은 String으로 변환해서 출력한다

int i = 출력하려는 값;
bw.write(String.valueOf(i));
bw.flush();
bw.close();

1. BufferdWrite는 자동 줄바꿈이 되지 않기 때문에 줄바꿈 하려면 개행 처리를 해줘야 한다.

2. 버퍼링을 걸어놨기 때문에 반드시 bw.flush()와 bw.close()를 통해

남아 있는 데이터를 모두 출력하고, 메소드를 닫아줘야 한다.  

 

 

 

일단 정리는 해뒀지만

사실 아리송~하다

 

다른 문제에서 곧 쓸 날이 있을 거다.

그 때 이 게시물을 다시 열어보는 미래의 나야 힘내렴 

Comments