Do it! 알고리즘 입문: 자바 편 (23)[책리뷰 & Book review]
본문 바로가기

컴퓨터공부/책리뷰 & book review

Do it! 알고리즘 입문: 자바 편 (23)[책리뷰 & Book review]

by Life & study 2024. 2. 5.
반응형

 

 

 

  Scanner에서 숫자와 문자를 구별해서 어떻게 작동하는가?

Scanner 클래스는 다양한 타입의 입력을 처리할 수 있습니다. 

즉, 숫자와 문자를 구별하여 입력받을 수 있습니다. 

이는 Scanner 클래스가 다양한 타입에 대한 입력 처리 메서드를 제공하기 때문입니다.

다음은 Scanner를 사용하여 숫자와 문자를 구별하여 입력받는 예제 코드입니다:

java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("숫자를 입력하세요:");
        int number = sc.nextInt(); // 숫자 입력
        System.out.println("문자를 입력하세요:");
        String str = sc.next(); // 문자 입력
        System.out.println("입력받은 숫자는 " + number + "이고, 입력받은 문자는 " + str + "입니다.");
    }
}


이 코드는 먼저 사용자로부터 숫자를 입력받고, 그 다음으로 문자를 입력받습니다. 

nextInt() 메소드를메서드를 사용하여 숫자를, next() 메서드를 사용하여 문자를 입력받습니다.




 

수열이란 무엇인가?

 

'주어진 수열’이란 문제에서 미리 정의된 숫자의 나열을 의미합니다. 

이는 배열이나 리스트와 같은 데이터 구조를 사용하여 표현될 수 있습니다.

 

 

 

 

 

 

 

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " "); 란 무엇인가?

 

BufferedReader: 자바에서 텍스트 데이터를 읽어들일 때 사용하는 클래스입니다. InputStreamReader 혹은 FileReader 등 다른 Reader 클래스와 함께 사용되며, 버퍼를 활용하여 한번에 대량의 데이터를 읽어 들여 성능을 향상합니다.
java

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


위 코드에서는 System.in 즉, 표준 입력 스트림을 InputStreamReader로 읽어들이고, 이를 다시 BufferedReader로 감싸서 사용합니다. 이렇게 하면 한 번에 여러 문자를 읽어 들일 수 있어 입력 속도가 빨라집니다.

InputStreamReader: 

바이트 단위로 읽어들인 데이터를 문자 단위로 변환해 주는 클래스입니다. 

InputStream을 Reader로 변환해주는 브리지 역할을 합니다.


StringTokenizer: 문자열을 구분자를 기준으로 나누는 클래스입니다. nextToken() 메서드를 사용하여 다음 토큰(여기서는 구분자로 나눠진 문자열의 한 부분)을 가져올 수 있습니다.
java

StringTokenizer st = new StringTokenizer(br.readLine(), " ");


위 코드에서는 br.readLine()으로 한 줄의 문자열을 읽어들이고, 이를 공백(" ")을 기준으로 나눕니다. 이후 st.nextToken()을 통해 나눠진 토큰을 하나씩 가져올 수 있습니다.

System.in --> InputStreamReader --> BufferedReader --> String (readLine()) --> StringTokenizer --> String tokens


즉, System.in에서 입력되는 바이트 단위의 데이터를 문자 단위로 변환한 뒤, 이를 버퍼를 통해 한번에 읽어 들인다. 그리고 한 줄을 읽어 들여 공백을 기준으로 나누고, 이를 순차적으로 처리한다는 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 BufferedReader와 Scanner 에서 왜 BufferedReader를 사용했는가?

 

자바에서 BufferedReader와 Scanner는 모두 입력을 읽는 데 사용되지만, 

각각의 특성과 사용법이 다릅니다12.

BufferedReader

BufferedReader는 문자, 배열 및 행을 효율적으로 읽을 수 있도록 문자 입력 스트림에서 버퍼링을 제공합니다 1.
BufferedReader는 큰 데이터를 읽을 때 더 빠르며, 효율적입니다1.
BufferedReader는 동기화되어 있어 멀티스레드 환경에서 안전합니다1.
BufferedReader는 단순히 문자열을 읽는 것에 초점을 맞추고 있습니다1.

 

Scanner

Scanner는 입력 스트림에서 토큰을 구문 분석하는 데 사용됩니다1.
Scanner는 다양한 타입의 입력(정수, 실수, 문자열 등)을 처리하는 메서드를 제공합니다 1.
Scanner는 동기화되어 있지 않아 멀티스레드 환경에서는 주의가 필요합니다1.
Scanner는 입력을 구문 분석하는 것에 초점을 맞추고 있습니다1.

 

따라서, 이 문제에서는 입력의 크기가 크고(최대 10^6), 각 숫자를 개별적으로 처리해야 하므로 BufferedReader를 사용하는 것이 더 효율적입니다. 또한, 

BufferedReader를 사용하면 readLine() 메소드를 통해 한 줄의 입력을 한 번에 읽을 수 있으므로 코드가 더 간결해집니다.

반면에 Scanner를 사용하면 nextInt() 메소드를 통해 각 숫자를 개별적으로 읽어야 하므로 코드가 더 복잡해질 수 있습니다. 또한, Scanner는 내부적으로 정규 표현식을 사용하여 입력을 구문 분석하므로 BufferedReader보다 느릴 수 있습니다 1.


 

 

 

BufferedReader와 Scanner의 사용법

 

BufferedReader와 Scanner의 사용법

BufferedReader 사용 예제
java

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("문자열을 입력하세요:");
        String line = br.readLine();
        System.out.println("입력받은 문자열: " + line);
        br.close();
    }
}


위 코드는 사용자로부터 한 줄의 문자열을 입력받아 출력하는 간단한 프로그램입니다. 

BufferedReader의 readLine() 메서드를 사용하여 한 번에 한 줄씩 읽어옵니다.

Scanner 사용 예제
java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("정수를 입력하세요:");
        int number = scanner.nextInt();
        System.out.println("입력받은 정수: " + number);
        scanner.close();
    }
}


위 코드는 사용자로부터 정수를 입력받아 출력하는 간단한 프로그램입니다.

 Scanner의 nextInt() 메소드를 사용하여 정수를 읽어옵니다.

BufferedReader:

System.in --> InputStreamReader --> BufferedReader --> String (readLine())
Scanner:

System.in --> Scanner --> int (nextInt()) / String (nextLine()) / double (nextDouble()) / etc.
즉, BufferedReader는 문자열을 한 줄씩 읽어오는 데 사용되고, Scanner는 다양한 타입의 입력을 읽어오는데 사용됩니다. 따라서 입력의 형태와 크기에 따라 적절한 클래스를 선택하면 됩니다.

 

 

 

 

반응형

댓글