입출력 라이브러리 비교

seungwon·2023년 6월 5일
0

TIL

목록 보기
2/2

[JAVA] Scanner vs. BufferedReader

Scanner(println) vs. BufferedReader(Writer)

입력의 경우 7~8배, 출력의 경우 거의 40배 가량 차이가 난다고 합니다

BufferedReaderScanner 의 차이점

BufferedReader
Scanner
https://juno-juno.tistory.com/99

  • Scanner vs. BufferedReader
    • Scanner의 경우 (1KB) , BufferedReader은 (8KB) , 이것은 즉 긴 문자열이 포함된 파일을 읽을 시에는 BufferedReader을 추천하지만 내용이 짧을경우 Scanner을 사용하는 것을 추천한다.
    • Scanner은 정규식을 사용하여 값을 파싱한다.
      예를 들어 int, long, short, florat 혹은 double의 경우 nextInt(),nextLong(),nextShort(),nextFloat(), nextDouble() 과같은 함수들을 사용한다. 반면에 BufferedReader은 오직 문자열 값만을 읽기 때문에 readLine() 함수만을 사용한다.
    • BufferedReader의 경우 동기화를 사용하지만 Scanner은 사용하지 않는다.
      • 여러 스레드간에 Scanner은 공유할 수 없지만 BufferReader개체는 공유할 수 있다. 동기화를 사용하는 BufferedReader의 경우 single thread를 사용하는 Scanner보다 약간 느리다. 하지만 Scanner의 경우 정규식을 사용하여 값을 받으므로 이러한 속도 차이는 보상을 넘어 BufferedReader가 더 빠르게 문자열을 읽을 수 있게 된다.

입력 - BufferedReader, StringTokenizer

public void solution() throws Exception{
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	// int 입력 받기
	int n = Integer.parseInt(br.readLine());

	// n*n크기의 int 배열 입력받기
	int[][] arr = new int[n][n];
	for(int r=0;r<n;r++){
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int c=0;c<n;c++){
			arr[r][c] = Integer.parseInt(st.nextToken());
		}
	}
}

BufferedReader

readLine : 개행까지 읽음

StringTokenizer

  • 생성자(Constructor)
    생성자설명
    public StringTokenizer(String str);절달된 매개변수 str을 기본(default) delim으로 분리합니다. 기본 delimiter는 공백 문자들인 " \t\n\r\t"입니다.
    public StringTokenizer(String str,String delim);특정 delim으로 문자열을 분리합니다.
    public StringTokenizer(String str,String delim,boolean returnDelims);str을 특정 delim으로 분리시키는데 그 delim까지 token으로 포함할지를 결정합니다. 그 매개변수가 returnDelims로 true일시 포함, false일땐 포함하지 않습니다.
  • 메소드
    • Object nextElement(), String nextToken() : 다음의 토큰을 반환합니다.
      • 두 가지 메소드는 같은 객체를 반환하는데 반환형이 다름
        nextElement는 Object를, nextToken은 String을 반환하고 있습니다.

출력 - BufferedWriter, StringBuilder

배열 출력 - BufferedWriter

  • String만 출력 가능
  • println 처럼 자동으로 개행을 출력해 주지 않음 → 필요시 newLine() 별도로 호출
  • bw.flush() : 남아있는 데이터 비우기
  • bw.close() : 출력 스트림 모두 닫기
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        for (int r = 0; r < n; r++) {
            for (int c = 0; c < n; c++) {
                bw.write(String.valueOf(arr[r][c]));
            }
            bw.newLine();
        }
        bw.flush();
    }

대안 : StringBuilder 로 모아서 System.out.println()으로 출력

StringBuilder sb = new StringBuilder();

for (int r = 0; r < n; r++) {
    for (int c = 0; c < n; c++) {
        sb.append(arr[r][c]);
    }
    sb.append('\n');
}

System.out.print(sb);

[JAVA] bfs 구현시 주의 사항

노드의 방문 여부를 표시하는 visited[v] 업데이트시 해당 코드의 위치 주의

ex)

while (!queue.isEmpty()) {
    nextIdx = queue.poll();
    r = nextIdx / MUL;
    c = nextIdx % MUL;
    for (int d = 0; d < 4; d++) {
        nr = r + dr[d];
        nc = c + dc[d];
        if (isInRange(nr, nc) && (input[nr][nc] > 0)) {
            queue.offer(MUL * nr + nc);
            input[nr][nc] = 0;
            area++;
        }
    }
}

0개의 댓글