JAVA 코테 | Scanner, println → BufferedReader/Writer | 시간초과로 입출력 변경

2022. 3. 28. 11:35·JAVA

Java로 코딩테스트를 칠 때,

느리다고 유명한 Scanner보다 BufferedReader를 쓰라는 말이 있다.

 

지금까지는 나는 Scanner를 사용했었다. 왜냐하면,

직접적으로 BufferedReader의 필요를 느끼는 순간이 금방 올 거라고 생각했고,

그 순간에 BufferedReader의 효과를 직접 느끼면서 Scanner -> BufferedReader로 갈아끼우고 싶어서이다.

이번에 그 순간이 왔다!

이 문제를 풀면서다. BOJ2448

 

이 문제의 입출력 특징 : 

입력 : 맨 처음에 정수 하나만 들어온다.

출력 : matrix의 모든 내용물을 for문을 돌며 출력해줘야 한다.

첫 시도에서는 여기서 System.out.print()를 사용해주었는데, 시간 초과를 만났다.

그래서 print대신에 BufferedWriter로 갈아끼워줬다. 시간 초과를 피할 수 있었다.

 

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

 

for문을 돌며 출력해줘야 하는 배열의 크기가 최대 char[3072][6143]이 나오는 문제다.

System.out.print()를 BufferedReader의 write()로 변경해주니까 시간초과 문제가 해결되었다.

 

모든 matrix를 돌며 출력해야 하는 문제라서 for문을 더이상 줄이는 것은 불가능하다고 판단했다.

그래서 print문을 BufferedReader로 바꿔주었다.

 

 

BufferedReader/Writer에 대한 블로그 글:

 

[Java] BufferedReader, BufferedWriter를 활용한 빠른 입출력

BufferedReader/BufferedWriter는 Buffer에 있는 IO 클래스입니다. 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달되됩니다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치로

coding-factory.tistory.com

 

 


소스 코드

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


public class Main{
  // int maxN = 3 * (int)Math.pow(2, 10);
  // int maxSize = (maxN/3) * 5 + (maxN/3-1);
  public static char[][] matrix = new char[3072][6143];

  public static void drawTriangle(int x, int y, int length){
    if (length == 3){
      matrix[y][x+2] = '*';
      matrix[y+1][x+1] = '*';
      matrix[y+1][x+3] = '*';
      for (int i = 0; i < 5; i++)
        matrix[y+2][x+i] = '*';
      return;
    }
    int half = length / 2;

    drawTriangle(x + half, y, half);
    drawTriangle(x, y + half, half);
    drawTriangle(x + length, y+half, half);
  }
  
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    int length = Integer.parseInt(br.readLine());

    for (int i = 0; i < length; i++){
      for (int j = 0; j < 2*length - 1 ; j++)
        matrix[i][j] = ' ';
    }

    drawTriangle(0, 0, length);

    for (int i = 0; i < length; i++){
      for (int j = 0; j < 2*length - 1 ; j++)
        bw.write(matrix[i][j]);
      bw.newLine();
    }
    br.close();
    bw.flush();
    bw.close();
  }
}

 

 

반응형

'JAVA' 카테고리의 다른 글

오버라이딩 반환타입 불일치? 상속관계면 반환타입이 달라도 된다  (0) 2022.07.19
실전 JAVA 소프트웨어 개발 | 입출금 내역 분석기 확장 실습하기  (0) 2022.04.06
실전 Java 소프트웨어 개발 | 입출금 내역 분석기 실습하기  (0) 2022.03.26
열거 타입, 열거 상수란? | 열거타입(enum) 변수 | enum, enumeration type  (0) 2021.07.03
클래스의 정렬(대소판정)기준 | comparable, compareTo, comparator, compare | 자연정렬(natural ordering)  (0) 2021.06.28
'JAVA' 카테고리의 다른 글
  • 오버라이딩 반환타입 불일치? 상속관계면 반환타입이 달라도 된다
  • 실전 JAVA 소프트웨어 개발 | 입출금 내역 분석기 확장 실습하기
  • 실전 Java 소프트웨어 개발 | 입출금 내역 분석기 실습하기
  • 열거 타입, 열거 상수란? | 열거타입(enum) 변수 | enum, enumeration type
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (389)
      • 미분류글 (32)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
JAVA 코테 | Scanner, println → BufferedReader/Writer | 시간초과로 입출력 변경

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.