[백준] 10871번: X보다 작은 수 - JAVA[자바]

다인·2024년 6월 20일

백준

목록 보기
2/112
post-thumbnail

매우 간단한 문제이지만 배열과 BufferedReader의 사용 여부에 따른 성능 차이가 궁금하여 비교해 보았다

4가지 방법

1. Scanner + 배열 X

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int X = sc.nextInt();
        
		StringBuilder sb = new StringBuilder();
 
		for(int i = 0 ; i < N ; i++) {
			
			int value = sc.nextInt();
			if(value < X) {
				sb.append(value+" ");
			}
		}
		System.out.println(sb);	
	}
}

여기서 StringBuilder란?

String

  • 자바의 String 클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없다!
  • 문자열을 합칠 때마다 새로운 문자열 객체가 생성되므로 메모리를 많이 잡아 먹게 된다.

StringBuffer

  • 문자열 편집이 가능한 buffer를 가지고 있는 StringBuffer를 사용하면 이 문제를 해결할 수 있다. StringBuffer는 새로운 객체를 생성하는 게 아니라 기존의 데이터 뒤에 붙이는 것이기 때문이다.
  • StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있는데, 동기화는 StringBuffer의 성능을 떨어뜨리게 된다.

StringBuilder

  • 그래서 StringBuffer에서 쓰레드의 동기화가 빠진 StringBuilder가 등장했다. 나머진 다 똑같다!
  • 즉, 편집이 필요하며 멀티쓰레드가 아닌 환경에서는 성능을 위해 StringBuilder를 사용하면 되는 것.

2. Scanner + 배열 O

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
 
		int N = sc.nextInt();
		int X = sc.nextInt();
		int arr[] = new int[N];
        
		for (int i = 0; i < N; i++) {
			arr[i] = sc.nextInt();
		}
        
		for (int i = 0; i < N; i++) {
			if (arr[i] < X) {
				System.out.print(arr[i] + " ");
			}
		}
	}
}

3. BufferedReader + 배열 X

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        StringBuilder sb = new StringBuilder();
 
		int N = Integer.parseInt(st.nextToken());
		int X = Integer.parseInt(st.nextToken());
        
		st = new StringTokenizer(br.readLine(), " ");
		
		for (int i = 0; i < N; i++) {
			int value = Integer.parseInt(st.nextToken());
 
			if (value < X)
				sb.append(value).append(' ');
		}
		System.out.println(sb);
	}
}

4. BufferedReader + 배열 O

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");

        int N = Integer.parseInt(st.nextToken());
        int X = Integer.parseInt(st.nextToken());
        int[] arr = new int[N];

        st = new StringTokenizer(br.readLine()," ");

        for(int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] < X){
                System.out.print(arr[i] + " ");
            }
        }
        br.close();
    }
}

바보 같이 print를 안 쓰고 println을 써서 '출력 형식이 잘못되었습니다' 떴다ㅎ

결론

Scanner + 배열 O < Scanner + 배열 X < BufferedReader + 배열 O < BufferedReader + 배열 X
1차원 배열에 속하는 문제임이 무색하게 배열을 쓰지 않을 때의 성능이 젤 좋다..

0개의 댓글