카테고리 없음

[알고리즘] JAVA 기초 다지기 (1) - 입력

lee_jy_1204 2024. 9. 24. 21:20
작성자 이재영
일 시 2024. 9. 24 (화) 18:00 ~ 21:00
장 소 복지관 b128-1호
참가자 명단 임혜진, 이재영, 성창민, 김명원, 장원준
 사 진


더보기

목차

  1. Scanner
  2. BufferedReader
  3. 다양한 입력 예제

지난 주차에 백준을 풀 때 느꼈던 기본기 부족을 위해 이번 주차는 입력을 주제로 스터디를 진행할 것이다. 주제를 입력으로 한 이유는 백준 문제를 풀면서 입력을 일단 잘 받아야 하는데, 시간초과가 뜨거나 행렬을 입력받거나, 한줄로 입력된 숫자를 하나 씩 입력받거나 하는 등에 입력을 원래 주 언어였던 파이썬으로 했을 때와 난이도 차이가 심해 공부가 필요하겠다고 느껴서기 때문이다.

1. Scanner

자바를 공부하면 가장 먼저 배우는 입력 방식이다. 자바에서 사용자로부터 콘솔 입력을 읽을 수 있는 간단한 방법을 제공하는 클래스이다. 문자, 문자열, 정수, 실수, boolean 등 다양한 형태의 데이터를 입력받을 수 있다.

 

Scanner의 주요 특징은 다음과 같다.

  • 다양한 데이터 타입 지원 : nextInt(), nextLine(), nextDouble() 등 다양한 메서드를 제공하여 다양한 데이터 타입을 손쉽게 입력받을 수 있다.
  • 줄 단위 입력 : nextLine() 메서드는 한 줄 전체를 입력받는 데 사용된다. 여러 단어를 포함한 긴 문자열을 처리할 때 유용하다.
  • 공백을 기준으로 구분 : Scanner는 기본적으로 공백(스페이스, 탭, 엔터)을 기준으로 입력을 분리한다. 예를 들어, next() 메서드는 공백으로 구분된 첫 번째 토큰을 반환한다.
  • 파일 및 기타 입력 소스 처리 : Scanner는 콘솔 입력뿐만 아니라 파일, 문자열, 네트워크 소켓 등 다양한 입력 소스를 처리할 수 있다.

사용법

Scanner를 사용하려면 일단 패키지를 하나 import 해야한다.

import java.util.Scanner;

 

이렇게 import를 한 이후, 객체를 생성한다. 양식은 이러하다. Scanner 객체명 = new Scanner(System.in);

Scanner scanner = new Scanner(System.in);

 

객체까지 생성했으면 사용할 준비는 끝났다. 그리고 이 객체를 사용하면 다양한 타입의 데이터를 받을 수 있는데, 그 메소드의 종류는 다음과 같다.

메서드명 설명
nextInt() 정수를 입력받는다.
nextFloat() 실수를 입력받는다.
nextDouble() 큰 크기의 실수를 입력받는다.
nextBoolean() Bool 값을 입력받는다.
nextLine() 문자 또는 엔터를 치기 전까지의 문장 전체를 입력받는다.
next() 공백을 기준으로 한 단어 또는 한 문자씩 입력받는다.

2. BufferedReader

자바에서 입력을 효율적으로 처리할 수 있게 도와주는 클래스이다. 주로 파일이나 콘솔에서 텍스트 데이터를 읽어오는 데 사용되며, 대량의 입력을 버퍼링하여 성능을 최적화하며, 한 번에 한 줄씩 입력을 읽을 수 있어 대용량 데이터를 처리할 때 유리하다.

 

BufferedReader의 주요 특징은 다음과 같다.

  • 버퍼링된 입력 : BufferedReader는 입력을 버퍼링하여 성능을 향상시킨다. 즉, 데이터를 한 번에 읽고, 읽은 데이터를 메모리에 저장하여 필요한 만큼 처리하는 방식으로, 입력이 발생할 때마다 직접 데이터를 읽는 방식보다 빠르다.
  • 줄 단위 입력 : BufferedReader는 주로 readLine() 메서드를 통해 한 줄씩 입력을 읽는다. 이 방법은 텍스트 기반 입력을 다룰 때 유용하다.
  • 다양한 입력 소스 : BufferedReader는 파일, 콘솔, 문자열 등 다양한 입력 소스에서 데이터를 읽을 수 있다.
  • IOException 처리 : BufferedReader를 사용할 때는 입출력 예외가 발생할 가능성이 있기 때문에 반드시 예외 처리가 필요하다.

사용법

BufferedReader를 사용하기 위해서는 3개의 패키지를 import 해야한다.

import java.io.BufferedReader; // 입력 스트림에서 데이터를 효율적으로 읽기 위해 버퍼링을 제공하는 클래스입니다.
import java.io.IOException; // 입출력 작업 중에 발생하는 예외를 처리하는 데 사용됩니다. 
import java.io.InputStreamReader; // 바이트 스트림을 문자 스트림으로 변환해 주는 클래스입니다.

 

다음엔 Scanner와 마찬가지로 객체를 선언해준다.

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

 

이렇게 객체까지 생성했으면 사용할 준비는 끝났다. 주로 사용하는 메서드들은 다음과 같다.

메서드명 설명
readLine() 입력 스트림에서 한 줄을 읽어온다. 줄바꿈 문자를 만나면 그 전까지의 문자열을 반한한다.
read() 입력 스트림에서 하나의 문자를 읽는다. 반환되는 값은 문자의 정수형 유니코드 값이다.
ready() 입력 스트림에서 읽을 수 있는 데이터가 있는지 확인하고, bool 값을 리턴한다.
close() BufferedReader가 사용하는 스트림을 닫고, 자원을 해제한다.

3. 다양한 입력 예제

3-1) 기본적인 입력

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // Scanner 객체 생성

        // 문자열 입력
        System.out.print("문자열 입력 : ");
        String str = scanner.nextLine();  // 한 줄 전체 입력

        // 정수 입력
        System.out.print("정수 입력 : ");
        int num = scanner.nextInt();  // 정수 입력

        // 실수 입력
        System.out.print("실수 입력 : ");
        double dou = scanner.nextDouble();  // 실수 입력

        // 결과 출력
        System.out.println("문자열: " + str + ", 정수: " + num + ", 실수: " + dou);

        scanner.close();  // 리소스 해제
    }
}

실행결과

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

public class Main {
    public static void main(String[] args) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        try {
            System.out.println("문자열를 입력하세요: ");
            String charCode = reader.readLine();  // 한 문자를 읽음

            System.out.println("입력한 문자열: " + charCode);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

실행결과

 

3-2) 한 줄에 여러 정수 입력

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a, b;
        a = sc.nextInt();
        b = sc.nextInt();
        System.out.printf("%d %d", a, b);
    }
}

이렇게 코드를 작성하면 정수를 한 줄에 사용해도, 엔터키를 입력해도 잘 받아진다.

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

public class Main {
    public static void main(String[] args) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try{
            String input = reader.readLine();

            // 공백 기준으로 문자열을 나누고, 각각을 정수로 변환
            String[] tokens = input.split(" ");
            int[] numbers = new int[tokens.length];

            for(int i = 0; i < tokens.length; i++){
                numbers[i] = Integer.parseInt(tokens[i]); // 문자열을 정수로 변환
            }

            // 정수 배열 출력
            for (int num : numbers) {
                System.out.println(num);
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

코드가 조금 더 길어지긴 했지만 원래 BufferedReader는 문자를 받기 위한 방법이기 때문에 문자로 입력을 받고, 그것을 정수로 형변환 시켜주는 방식으로 해야한다. 정수를 한줄에 하나만 받으려면 int a = Integer.parseInt(reader.readLine(); 이렇게 받으면 된다.

 

3-3) 입력한 정수에 따른 배열 입력

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a;
        a = sc.nextInt();

        int[] arr = new int[a];
        for(int i = 0; i < a; i++){
            arr[i] = sc.nextInt();
        }

        for(int i = 0; i < a; i++){
            System.out.print(arr[i] + " ");
        }
    }
}

 

3-4) 한줄에 띄어쓰기 없이 입력된 정수 하나 씩 저장(2차원 배열)

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

public class Main {
    public static void main(String[] args) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try{
            int n = Integer.parseInt(reader.readLine());
            int m = Integer.parseInt(reader.readLine());
            int[][] list = new int[n][m];

            // 문자열로 받아 그 문자열을 한글자 씩 떼어 리스트에 넣어준다.
            for(int i=0;i<n;i++){
                String line = reader.readLine();
                for(int j=0;j<m;j++){
                    list[i][j] = line.charAt(j)-'0';
                }
            }

            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    System.out.print(list[i][j]+" ");
                }
                System.out.println();
            }

        } catch (IOException e){
            e.printStackTrace();
        }
    }
}


이렇게 오늘은 자바에서 많이 사용하는 입력의 종류에 대해서 알아보고 직접 사용해보았다. 다음 주차에는 출력의 방법을 좀 더 상세히 스터디해 보고자 한다.