exponential_e   5년 전

자바로 작성했습니다.

계속 2%에서 런타임 에러가나서 같은코드로 입력만 BufferedReader에서 Scanner로 변경해보았더니 통과하였습니다.

제가 아직 초짜기에.. 스캐너와 버퍼드리더 사이에 다른 차이가 있어서 그런건지 어떤건진 모르겠네요.

혹시 모르니 일단 채점 번호 첨부하겠습니다. 확인 한번 부탁드려요!!

RTE

9138248

AC (Scanner 사용)

9138271

isku   5년 전

한 라인에 읽을 수 있는 문자열 크기가 매우 큽니다.

String 객체 하나에 받을 수 있는 메모리가 초과해서 나는 런타임 에러입니다.

exponential_e   5년 전

답변 감사드립니다.

https://www.acmicpc.net/board/...

결국 여기 써주신 답변과 같은 문제였군요.

스캐너는 자체로 문자열을 내부에서 처리해서 바로 nextInt() 이렇게 뽑아주어서 가능한건가보네요.. 컴퓨터의 세계란..휴

어쩐지 fastio도 잘 돌아가더군요ㅠㅠ 어찌됐든 감사합니다!!!

exponential_e   5년 전

아아 링크도 다시 달아주셨네요 감사합니다!!

isku   5년 전

BufferedReader나 Scanner는 내부에 버퍼가 있습니다.

인풋을 읽어올 때 한번에 모든 인풋을 읽지 않고, 버퍼 크기만큼 읽어옵니다.

BufferedReader는 기본 버퍼크기가 8192이고, Scanner는 1024로 알고 있습니다.

nextInt() 같은 함수는 버퍼크기 만큼 인풋을 읽고, 현재 어디까지 버퍼에 데이터를 읽었는지 접근할 수 있는 포인터를 하나 두어

앞에서 부터 순서대로 파싱하여 바로바로 결과를 줍니다.

만약 포인터가 버퍼크기를 초과하면 그 다음 인풋을 버퍼에 그대로 덮어씌우는 방식입니다.

두 클래스 내부적으로 동작하는 방식이 비슷하지만, Scanner가 nextInt() 같은 편한 함수가 있어서 자주 사용합니다.

exponential_e   5년 전

아아 자세한 설명 감사드려요!! 

웬만하면 버퍼드리더가 빠르게 돌아서 사용했었는데, 이제 상황에 따라 맞춰 쓰는 것도 생각해야겠네요 ㅎㅎ

댓글을 작성하려면 로그인해야 합니다.