[BaekJoon] 10818번 - 최소, 최대 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 256MB


- 문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

- 입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

- 출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

- 예제

  입력      출력  
5
20 10 35 30 7
7 35





2. 풀이



2개의 입력방식을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스




2-1. Scanner 클래스

  • 배열 을 사용해 값을 비교한다.

import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        int[] arr = new int[N];
        
        for(int i=0;i<N;i++){
          arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);
        System.out.println(arr[0] + " " + arr[N-1]);
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

int형 데이터를 입력받기 위해 nextInt() 메서드를 사용한다.

Arrays 클래스의 sort() 함수 는 인자에 넣은 배열을 오름차순 정렬 한다.



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요





2-2. BufferedReader 클래스 사용

BufferedReader는 readLine() 메서드를 사용해 한 행을 전부 읽는다.
이를 공백단위로 분리해야 하는데, StringTokenizer 클래스를 사용하여 분리한다.



배열을 사용하면 최악의 경우 시간복잡도가 N² 이다.
메모리와 시간낭비를 막기 위해 배열을 사용하지 않고 입력 즉시 비교하는 방법을 추천한다.
2가지 경우를 아래에서 비교해보자.




① 배열 사용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int[] arr = new int[N];
        
        for(int i=0;i<N;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        System.out.println(arr[0] + " " + arr[N-1]);
    }
}

readLine()은 한 줄을 통째로 읽어 String으로 반환하기 때문에, StringTokenizer 클래스의 nextToken()를 이용해 공백으로 구분된 입력값들을 순서대로 가져온다.

Integer.parseInt()을 사용해 String형을 int형으로 변환시켜준다.



[여기서 잠깐!]

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));
        
        Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int min = 1000001;
        int max = -1000001;
        
        while(st.hasMoreTokens()){
            int val = Integer.parseInt(st.nextToken());
            
            if(min > val) min = val;
            if(max < val) max = val;
        }
        System.out.println(min + " " + max);
    }
}

StringTokenizer를 사용해 문자열을 공백단위로 구분한 값들을 토큰 이라고 한다.
while 조건문 에서 hasMoreTokens() 함수 를 사용해 토큰 개수만큼 반복한다.





3. 성능 비교

image

위에서 부터 순서대로

BufferedReader + 배열 X
BufferedReader + 배열
Scanner + 배열

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.

또한, 배열을 사용하지 않은 경우가 훨씬 빠르다.
배열을 사용하면 최악의 경우 시간복잡도가 N² 이지만, 배열을 사용하지 않고 즉시 비교하면
시간복잡도가 N 이므로 훨씬 시간이 단축된다.





관련 페이지

Categories:

Updated:

Leave a comment