개발자는 기록이 답이다

[백준/BOJ][Java][11720] 숫자의 합 본문

알고리즘/백준

[백준/BOJ][Java][11720] 숫자의 합

slow-walker 2023. 8. 23. 11:24

 

2023.08.21 - [알고리즘/백준] - Java, String의 constant pool과 Heap의 차이

 

Java, String의 constant pool과 Heap의 차이

Java String 문자열? 순서를 가진 문자들의 집합 “쌍따옴표를 통해 나타낼 수 있음” 글자, 단어, 문장, 문서 등 문자로 구성된 자료형 // 기본 자료형 int var_integer = 10; double var_real - 3.141592; char var_ch

strong-park.tistory.com


https://www.acmicpc.net/problem/11720

 

11720번: 숫자의 합

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

www.acmicpc.net

 

간단하게 입력받은 문자 숫자를 숫자로 형변환해서 다 더해주는 문제이다.

나는 Scanner밖에 안써봤는데 문자열을 입력받을때 다른 방법이 있는 것 같다.

 

내가 푼 풀이

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        String num = sc.next();
        int ans = 0;
        String[] split = num.split("");
        for (String numStr : split) {
            ans += Integer.valueOf(numStr);
        }
        System.out.println(ans);
    }
}

 

메모리 시간 언어 코드 길이
17748KB 208ms Java11 398B

 

다른 사람이 푼 풀이

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));
		int N = Integer.parseInt(br.readLine());
		char[] numbers = br.readLine().toCharArray();
		int total = 0;
		
		for (int i = 0; i < N; i++) {
			total += Integer.parseInt(String.valueOf(numbers[i]));
		}
		System.out.println(total);
	}
}
메모리 시간 언어 코드 길이
12904KB 68ms Java8 460B

내가 푼 풀이와 다른 사람 풀이 비교

BufferedReader:

  • BufferedReader는 문자 입력 스트림을 버퍼링하여 읽어오는 클래스이다.
  • 버퍼링은 입출력의 성능을 향상시키는데 도움을 준다. 한 번에 많은 양의 데이터를 읽어와서 버퍼에 저장하므로 실제 I/O 작업을 줄일 수 있다.
  • 보통 InputStreamReader와 함께 사용하여 입력 스트림을 문자 스트림으로 변환한 후 BufferedReader를 통해 읽어온다.
  • 문자열을 읽어오는 메서드(readLine())를 제공하므로 편리하게 문자열을 처리할 수 있다.
  • 주로 텍스트 파일 등의 텍스트 데이터를 읽어올 때 사용된다.

InputStreamReader:

  • InputStreamReader는 바이트 입력 스트림을 문자 입력 스트림으로 변환하는 클래스이다.
  • 바이트 단위로 데이터를 읽어오는 스트림을 문자 단위로 변환하여 읽어올 수 있게 해준다.
  • BufferedReader와 함께 사용하여 버퍼링된 문자열을 효율적으로 읽어올 수 있다.

Scanner:

  • Scanner는 다양한 형식의 입력 데이터를 읽어오기 위한 클래스이다.
  • 문자열, 숫자, 정규 표현식 등 다양한 데이터를 파싱하여 읽을 수 있다.
  • 기본적으로 공백 문자를 기준으로 데이터를 나눠 읽기 때문에, 편리하게 입력을 처리할 수 있다.
  • 그러나 다양한 파싱 작업 때문에 BufferedReader에 비해 입출력 속도가 느릴 수 있다.
  • 작은 규모의 입력 처리나 간단한 파싱 작업에 적합하다.

요약하자면, BufferedReader는 대용량의 텍스트 데이터를 효율적으로 처리하기 위해 사용되며, InputStreamReader와 함께 사용하여 문자 스트림으로 변환된 데이터를 읽어온다. 반면 Scanner는 다양한 형식의 입력 데이터를 파싱하고 처리하기 위해 사용되며, 비교적 간단한 작업에 적합합니다.

 

BufferedReader가 Scanner보다 성능적인 면에서 더 낫다. 더 빠른 속도로 입력을 처리할 수 있고, 입력이 매우 큰 경우에도 처리할 수 있는 효율성을 가지고 있다. Scanner를 사용하여 입력을 받아오기 때문에 사용하기 간편하지만, BufferedReader에 비해 약간 느린 속도로 입력을 처리한다. 

 

BufferedReader가 입력 버퍼를 사용하여 문자열을 읽어오는 반면, Scanner는 정규 표현식을 사용하여 파싱하고 토큰화하기 때문이다.

BufferedReader는 입력 스트림을 버퍼에 저장하여 한 번에 읽어오는 방식으로, I/O 작업을 줄여 입출력 속도를 향상시킵니다. 이에 비해 Scanner는 입력을 더 자세하게 파싱하고 처리하기 위해 정규 표현식을 사용하므로, 입력 처리가 상대적으로 더 느릴 수 있다. 작은 입력에 대해서는 문제 없이 동작하지만, 큰 입력이 주어지는 경우 성능 저하가 있을 수 있다.

 

하지만, 입력의 크기가 크지 않아서 큰 차이가 없을때는 일반적으로는 입출력 속도보다도 코드의 가독성과 유지보수성을 중요시해야 한다.

 

 

흠 근데, 시간 테스트를 해봤는데 Scanner가 더 빠를때도 있는거 같고, 별로 차이 안나는데 이렇게 성능 테스트하는게 아닌건가..?

BufferedReader가 성능이 더 좋다는걸 코드상으로 어떻게 테스트해볼 수 있을까?

System.currentTimeMillis();


import java.util.Scanner;

public class ScannerTest {
    public static void main(String[] args) {
   		long start = System.currentTimeMillis();
        Scanner sc = new Scanner(System.in);
        String num = sc.next();
        int ans = 0;
        String[] split = num.split("");
        for (String numStr : split) {
            ans += Integer.valueOf(numStr);
        }
        long end = System.currentTimeMillis();
        System.out.println(ans);
        System.out.println("Scanner Time: " + (end - start) + " ms");

    }

}

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

public class BufferedReaderTest {

    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] numbers = br.readLine().toCharArray();
        int total = 0;
        for (int i = 0; i < numbers.length; i++) {
            total += Integer.parseInt(String.valueOf(numbers[i]));
        }
        long end = System.currentTimeMillis();
        System.out.println(total);
        System.out.println("BufferedReader Time: " + (end - start) + " ms");
    }
}

 

참고 링크 :

https://www.acmicpc.net/blog/search/%EC%9E%85%EB%A0%A5+%EC%86%8D%EB%8F%84 

 

블로그 - 전체 글

여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일

www.acmicpc.net

https://carpediem0212.tistory.com/11

 

BufferedReader와 Scanner

이번 포스팅에서는 Java에서 문자열을 입력받는 목적으로 많이 사용되는 BufferedReader 클래스와 Scanner 클래스에 대해 알아보려합니다. 두 Class 모두 문자열을 입력 받는데 사용된다는 공통점이 있

carpediem0212.tistory.com

https://studywithus.tistory.com/61

 

[JAVA] Scanner 와 BufferedReader의 차이 :: 우유

| Scanner 와 BufferedReader의 차이 이번 글은 자바를 처음 배울때 한번쯤은 써봤을 법한 클래스인 Scanner와 프로그래밍에 조금 더 익숙해지거나 특히 알고리즘 문제를 풀다가 자주 접하게 될 BufferedRead

studywithus.tistory.com

https://dlee0129.tistory.com/238

 

자바(JAVA) - Scanner & BufferedReader

자바(JAVA) - Scanner & BufferedReader 자바를 처음 배울 때 사용자(키보드) 입력받기 위해 보통 Scanner 클래스를 사용합니다. 하지만 알고리즘을 풀기 시작하면서 백준에서 Scanner를 사용하여 입력을 받으

dlee0129.tistory.com