아니 Java 입출력을 직접 만든다고?!

SIK407·2025년 7월 7일

알고리즘

목록 보기
7/7
post-thumbnail

흥!

◽ 서론

후...
[백준] 9024 - 두 수의 합
문제 자체는 그렇게 어려운 수준이 아니다.

근데...

자꾸 메모리 초과가 발생한다.
저건 Java 8로 제출한 상태.

Java 11로 제출을 해 보니...

꾸역꾸역 통과가 됐다.

근데 제출한 목록을 보니까

??????

메모리와 시간이 엄청나게 줄었다.


❓ 커스텀 InputReader?

입력을 초고속으로 읽어들이기 위해 직접 만든 "커스텀 InputReader"

static class InputReader {
	public byte[] buf;
	public int buf_p, size;

	public InputReader() {
		buf = new byte[1 << 24];
		buf_read();
	}

	public int nextInt() {
		if (buf_p == size) buf_read();
        if (size == -1) return -1;
		
        int i = 0;
		boolean negative = false;
		if (buf[buf_p] == '-') {
			negative = true;
			if (++buf_p == size) buf_read();
		}
        
		while (true) {
			if (buf[buf_p] < 48 || buf[buf_p] > 57) {
				buf_p++;
				return negative ? -i : i;
			}
			i = 10 * i + buf[buf_p++] - 48;
			
            if (buf_p == size) buf_read();
		}
	}

	private void buf_read() {
		try {
			size = System.in.read(buf);
			buf_p = 0;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

1. buf 배열

buf = new byte[1 << 24];
• 16MB 크기의 Byte 배열 (1 << 24 = 16,777,216)

2. buf_read() 메서드

size = System.in.read(buf);
buf_p = 0;
•	한 번에 표준 입력(System.in) 을 버퍼에 통째로 읽어옴.
•	size = 읽은 바이트 수
•	buf_p = 현재 읽고 있는 포인터 위치 (인덱스)

3. nextInt()

•	버퍼에서 바이트 하나씩 보면서 숫자로 파싱
•	음수 처리 ('-' 문자 확인)
•	'0' ~ '9' 범위 내의 숫자를 차례대로 곱해서 누적
•	숫자 아닌 문자가 오면 하나의 정수를 다 읽었다고 판단 → return

4. EOF 처리

if (size == -1) return -1;



◽ 결과

위에가 커스텀 클래스 사용
아래는 어거지로 통과

세상은 똑똑한 사람들이 넘쳐난다....

profile
감자 그 자체

0개의 댓글