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

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

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

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

 

 

 

Scanner와 BufferedReader의 10N개의 조건은 몇인가?

BufferedReader와 Scanner의 선택은 입력 데이터의 크기에 따라 결정됩니다. 일반적으로, 입력 데이터의 크기가 크면 클수록 BufferedReader를 사용하는 것이 더 효율적입니다. 반대로, 입력 데이터의 크기가 작으면 Scanner를 사용하는 것이 더 편리하고 간결할 수 있습니다.

BufferedReader: 대량의 데이터를 처리해야 할 때 사용합니다. 

일반적으로, 입력 데이터의 크기가 약 10^4 ~ 10^6 이상일 때 BufferedReader를 사용하는 것이 좋습니다.



Scanner: 작은 양의 데이터를 처리하는 경우에 사용합니다.

 Scanner는 사용하기 간편하며 다양한 타입의 입력을 처리할 수 있지만, 내부적으로 정규 표현식을 사용하기 때문에 BufferedReader보다 느릴 수 있습니다. 일반적으로, 입력 데이터의 크기가 

 10^3 ~ 10^4 이하일 때 Scanner를 사용하는 것이 좋습니다.




 

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

BufferedReader와 StringTokenizer의 작동 방식을 살펴보겠습니다.

BufferedReader는 자바에서 텍스트 데이터를 읽기 위한 클래스입니다.

 InputStreamReader와 함께 사용되어, 입력 스트림을 문자로 변환하고, 이 문자들을 버퍼에 저장합니다. 

 

그 후, readLine() 메소드를 통해 한 줄씩 읽어옵니다.
StringTokenizer는 문자열을 특정 구분자를 기준으로 나누어 토큰화하는 클래스입니다. 

생성자에 문자열과 구분자를 넘겨주어 객체를 생성하고, nextToken() 메서드를 통해 토큰을 하나씩 가져옵니다.
아래는 이를 도식화한 것입니다:

(System.in)
    |
    v
(InputStreamReader)
    |
    v
(BufferedReader) -> readLine() -> "5 3"
    |
    v
(StringTokenizer) -> nextToken() -> "5", "3"


자바 코드로는 다음과 같이 표현할 수 있습니다:

java

// 1. BufferedReader 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));



// 2. 한 줄 읽기
String line = br.readLine(); // 예를 들어, 사용자가 "5 3"을 입력했다고 가정합니다.

// 3. StringTokenizer 생성
StringTokenizer st = new StringTokenizer(line, " ");



// 4. 토큰 읽기

int N = Integer.parseInt(st.nextToken()); // "5"
int M = Integer.parseInt(st.nextToken()); // "3"


위 코드에서는 System.in을 통해 사용자로부터 입력을 받아, 이를 BufferedReader를 통해 한 줄 읽어옵니다. 이후, StringTokenizer를 통해 읽어온 문자열을 공백을 기준으로 토큰화하고, 각 토큰을 nextToken() 메서드를 통해 가져옵니다. 이때, Integer.parseInt()를 사용하여 문자열을 정수로 변환합니다.

 

 

 

StringTokenizer를 사용한 토큰화와 Scanner의 nextInt() 메소드를 사용한 방식은 문자열을 처리하는 방식에 차이는 무엇인가?

 

StringTokenizer를 사용한 토큰화와 Scanner의 nextInt() 메소드를 사용한 방식은 문자열을 처리하는 방식에 차이가 있습니다.

StringTokenizer의 토큰화: StringTokenizer는 문자열을 특정 구분자를 기준으로 나누어 토큰화하고, 이 토큰들을 순차적으로 반환하는 역할을 합니다. 즉, 주어진 문자열을 미리 정의된 구분자를 기준으로 분리하고, 그 결과를 하나씩 반환합니다. nextToken() 메서드는 다음 토큰을 문자열 형태로 반환하므로, 이를 원하는 데이터 타입으로 변환하기 위해 Integer.parseInt() 등의 메서드를 사용해야 합니다.
Scanner의 nextInt(): Scanner는 다양한 타입의 입력을 처리하는 메소드를 제공합니다. nextInt() 메서드는 입력에서 다음 토큰을 정수로 변환하여 반환하는 역할을 합니다. 따라서, nextInt()는 입력을 공백이나 줄 바꿈 등으로 구분된 토큰으로 나누고, 그중 다음 토큰을 정수로 변환하여 반환합니다. 이때, 변환 과정이 내부적으로 이루어지므로 별도의 변환 메서드를 사용할 필요가 없습니다.
따라서, 두 방식의 차이점은 입력 문자열을 처리하고 반환하는 방식과, 반환된 데이터의 타입에 있습니다. StringTokenizer는 문자열 형태의 토큰을 반환하고, 이를 사용자가 원하는 타입으로 변환해야 하는 반면, Scanner는 원하는 타입의 데이터를 직접 반환합니다

 

 

 

 

 

 

 

 

     int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
 에서 토큰화한다는 것은 뭐지?

 

nextToken()은 StringTokenizer 클래스의 메소드입니다.

 이 메서드는 StringTokenizer 객체가 분할하고 있는 문자열에서 다음 토큰을 반환합니다 1.

토큰이란, 문자열을 특정 구분자를 기준으로 분리한 각각의 부분을 의미합니다 1.

 예를 들어, "Hello, World!"라는 문자열을 공백을 기준으로 토큰화하면 

"Hello, "와 "World!"라는 두 개의 토큰이 생성됩니다.

nextToken() 메서드는 StringTokenizer 객체가 현재 가리키고 있는 위치의 토큰을 반환하고, 

내부적으로 위치를 다음 토큰으로 이동시킵니다 1. 

따라서, 이 메서드를 연속적으로 호출하면 StringTokenizer 객체는 문자열의 모든 토큰을 차례대로 반환합니다1.

다음은 nextToken() 메소드를 사용하는 간단한 자바 코드 예제입니다:

Java

import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
        StringTokenizer st = new StringTokenizer("Hello, World!");
        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }
    }
}



이 코드는 "Hello, World!"라는 문자열을 공백을 기준으로 토큰화하고, 각 토큰을 출력합니다. 

따라서, 이 코드의 출력은 "Hello, "와 "World!"라는 두 줄의 텍스트입니다 1.



 

 

 

 

StringTokenizer의 nextToken(): 이 메서드는 문자열을 토큰으로 분리는 "공백" 때문이다?

 

StringTokenizer의 nextToken() 메서드와 Scanner의 nextInt() 메서드는 문자열을 처리하는 방식에 따라 수열과 관련된 문제를 해결하는 데에 차이점이 있습니다.

StringTokenizer의 nextToken(): 이 메소드는 문자열을 토큰으로 분리하고, 각 토큰을 순차적으로 반환합니다. 수열과 관련된 문제에서는 주어진 문자열, 예를 들어 "1 2 3 4 5"와 같은 형태의 입력을 공백으로 구분된 토큰으로 분리하고, 각 토큰을 개별 숫자로 처리하는 데에 유용합니다.
java

StringTokenizer st = new StringTokenizer("1 2 3 4 5", " ");
while(st.hasMoreTokens()) {
    int number = Integer.parseInt(st.nextToken());
    // 수열의 각 원소를 처리하는 코드
}


이 방식의 장점은 문자열을 원하는 구분자로 쉽게 분리하고 처리할 수 있다는 것입니다. 단점은 반환된 토큰이 문자열이므로, 숫자 등 다른 타입으로 변환하기 위한 추가적인 처리가 필요하다는 것입니다.

"1 2 3 4 5" -- StringTokenizer --> "1", "2", "3", "4", "5"


Scanner의 nextInt(): 이 메소드는 입력에서 다음 정수를 반환합니다. 

수열과 관련된 문제에서는 입력된 숫자들을 순차적으로 읽어 처리하는 데에 유용합니다.


java

Scanner scanner = new Scanner("1 2 3 4 5");
while(scanner.hasNextInt()) {
    int number = scanner.nextInt();
    // 수열의 각 원소를 처리하는 코드
}


이 방식의 장점은 다양한 타입의 입력을 직접 처리할 수 있다는 것입니다. 

단점은 공백, 탭, 줄 바꿈 등 기본 구분자 외의 구분자를 사용하려면 추가적인 설정이 필요하다는 것입니다.

"1 2 3 4 5" -- Scanner --> 1, 2, 3, 4, 5


따라서, 두 방식 중 어느 것을 사용할지는 문제의 요구사항과 개발 환경에 따라 결정됩니다.

 

 

 

 

 

 

반응형

댓글