[백준 #1000] java 문자열 입출력 씹.뜯.맛🦑 1탄 : (입력) BufferedReader와 StringTokenizer는 친구입니다 (feat. split())

개발하는 튀튀·2025년 1월 14일
post-thumbnail

매우 기본적인 문자열 입력받아 콘솔창에 출력하기 문제이다
scanner가 익숙하다면 문제 보자마자
가장 먼저 생각나는 것은 아래 코드일 수 밖에 없다

이렇게 나옴.

하지만 우리들은 저 [메모리][시간]을 신경 안 쓸 수가 없다

그래서 다른 사람들이 먼저 시간을 어떻게 줄였는가.. 보면
바로 등장하는 게 BufferedReader와 StringTokenizer다



BufferedReader

요약하자면 BufferedReader 클래스는 이렇다

  1. 먼저 [입력 속도를 향상] 시킴으로서 시간 단축을 시켜주는 클래스
  2. 문자열로 입력 받고, 한 줄씩 받아오기 때문에 입력값에 후처리가 필요함

그렇다면 후처리는 어떻게 들어가나요 ?
할 때 나오는 게 StringTokenizer다


StringTokenizer

토큰 단위로 자잘자잘히 문자열을 나누는 클래스,
토큰 단위이기 때문에 [공백, 쉼표같은 한 글자짜리 구분자]로 나눈다

이 BufferedReader와 StringTokenizer를 함께 사용하면
입력값이 많고 복잡한 문제일 수록 속도가 눈에 띄게 향상된다




백준 1000번의 경우 둘을 써서 이렇게 코드를 짜볼 수 있음

시간이 훅 줄어드는 매직 ...
코테에서 이 둘은 그냥 외워뒀다가 일단 적어두고 시작하는 게 맞다



그런데 문자열 나누는 것 하면 생각나는 게 있다

우리... split 함수 좋아하지 않았나요 ?

얘는 토큰 단위가 아닌, 복잡한 문자열도 구분자로 설정이 된다
split()을 사용해서 문제를 풀어보자


큰 차이가 없어 보이는 결과인데,
토큰 단위로 나누는 게 처리 속도가 더 빠르지 않을까 싶어서 물어봤더니

(정말 최고애 GPT ...)

속도면에서도, 남은 토큰 수 계산해야 할 상황에서도
코테 상황에서 StringTokenizer를 안 쓸 이유가 없다


다시 한 번 ...

코테에서 BufferedReader와 StringTokenizer는 무조건 갖고 가자






추가로 씹뜯맛

난 코테가 아주 익숙한 사람은 아니지만 ...
코테를 풀면 꼭 시간, 메모리 순위별로 다른 사람 코드를 훔쳐보는 버릇이 있음

왜냐면 정말 미친(positive) 사람 많기 때문이다
그리고 그 사람들이 쓴 로직이나 꿀클래스를 흡수하면 짜릿하기 때문임


백준 1000번 문제는 매우매우 간단하지만,
그렇기에 어떻게 시간과 메모리를 더 줄였는지가 더 궁금했다

순위권 분들 다들 64ms 걸리시고, 메모리도 적으셔서 코드를 호록쟙쟙 보았다

// 이것이 그 코드
import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        StringTokenizer st = new StringTokenizer(line, " ");
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        System.out.println(a + b);
    }
}

예외처리

얼핏 보기엔 내 코드와 비슷해보이지만 보고 아차 한 것이 있었다

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

BufferedReader , Integer.parseInt() 같은,
특히 입출력을 다루는 애들은 오류 발생을 대비해 예외처리가 필요하다는 점.. 을 까먹고 있었다

실전 코딩이라면 try-catch를 사용하겠지만,
코테와 같은 (실제 프로젝트가 아닌) 문제풀이에서는 예외 던지기를 활용하자




그 외에 시간, 메모리가 적은 이유

예외처리를 넣은 해당 코드로 다시 돌려본 것이 아래의 104ms,
예외처리가 없을 때와 시간은 같다

68ms가 어떻게 나오나 했는데
java8과 java11의 차이였다


일단 궁금하니까 물어봤다 ...

이 코드 한정인 것 같다

그만 알아보자 👌🏻

profile
행복, 사랑, 건강, 개발, 하세요 !

0개의 댓글