성장일기

내가 보려고 정리하는 공부기록

코딩테스트/백준 브론즈,실버

[백준] 11654 : 아스키코드 (System.in에 대해) - JAVA

와나나나 2024. 1. 15. 18:13
728x90

백준 단계별 문제풀이 5단계 (문자열)

https://acmicpc.net/problem/11654

 

11654번: 아스키 코드

알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

# 문제

알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

 

# 예제

입력 - 알파벳 소문자, 대문자, 숫자 0-9 중 하나가 첫째 줄에 주어진다.

A

 

출력

65

 

# 필요개념

 

사실 그냥 입력받은 것을 int형으로 출력하면 되는 문제이다. 그런데 한 글자를 받기 위해 Scanner를 이용하는 것이 비효율적이라는 내용을 보았다!

우리는 Scanner를 사용할 때 new Scanner()에 인자로 넣는다. 여기서 System.in InputSstream 타입의 필드라고 한다.

 InputStream은 1byte만 읽어온다는 특징 때문에 문자를 그대로 읽지 못하는 경우가 발생한다(특히 한글). 이때 문자형태 변환을 지원해주는 InputStreamReader를 사용한다.

InputStreamReader은 문자단위 데이터로 변환해준다. 하지만 “문자열”은 지원해주지 않아 문자열 입력을 원하면 배열을 선언해야 한다. 이러한 단점때문에 BufferedReader를 이용해 Buffer에 문자를 쌓아두고 문자열처럼 내보내는 방식으로 사용한다고 한다!

 

부연설명을 하자면,  BufferReader는 다음과 같다.

데이터를 한번에 읽어와 버퍼에 보관한 후, 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스

즉 사용자가 입력한 문자 스트림을 파싱하지 않고 읽는 것이다.

 

여기서 Buffer

데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 해당 데이터를 보관하는 임시 메모리 영역이다. 주로 입출력 속도 향상을 위해 버퍼를 사용한다.
자바에서 제공되는 BufferedReader와 BufferedWriter라는 클래스를 이용해 Buffer를 다룰 수 있게 된다.

 

 

위와 같이 System.in을 통해 Scanner 객체를 생성한다.

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



즉 위 코드는 [System.in]= InputStream → InputStreamReader → BufferedReader 가 된다.

 


📌 그렇다면 Scanner를 쓰는건 왜 비효율적?

Scanner는 사용할 때 약 44줄의.. 정규식을 통과하여 검사한 후 반환한다. 그래서 속도가 느리기 때문에 시간 효율을 중요하게 생각하는 알고리즘에서는 BufferedReader가 선호될 수밖에 없다고 한다!

 

 

# Code

1. Scanner 사용

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.next().charAt(0);

        System.out.println(a);
    }
}

 

2. System.in 만 사용

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

        int a = System.in.read();
        System.out.print(a);
    }
}

 

 아래 결과를 보면 둘의 속도에 차이가 있음을 알 수 있다.

 

# 결과

 

위 : System.in만 사용 / 아래 : Scanner 사용