

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


이렇게 나옴.
하지만 우리들은 저 [메모리]와 [시간]을 신경 안 쓸 수가 없다
그래서 다른 사람들이 먼저 시간을 어떻게 줄였는가.. 보면
바로 등장하는 게 BufferedReader와 StringTokenizer다

요약하자면 BufferedReader 클래스는 이렇다
그렇다면 후처리는 어떻게 들어가나요 ?
할 때 나오는 게 StringTokenizer다

토큰 단위로 자잘자잘히 문자열을 나누는 클래스,
토큰 단위이기 때문에 [공백, 쉼표같은 한 글자짜리 구분자]로 나눈다
이 BufferedReader와 StringTokenizer를 함께 사용하면
입력값이 많고 복잡한 문제일 수록 속도가 눈에 띄게 향상된다


시간이 훅 줄어드는 매직 ...
코테에서 이 둘은 그냥 외워뒀다가 일단 적어두고 시작하는 게 맞다
우리... 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의 차이였다

이 코드 한정인 것 같다
그만 알아보자 👌🏻