상냥한 세상 :: [백준]10818번: 최소, 최대

본문으로 바로가기

[백준]10818번: 최소, 최대

category Computer Science/BAEKJOON JAVA Practice 2022. 1. 15. 15:01

https://www.acmicpc.net/problem/10818

 

10818번: 최소, 최대

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

www.acmicpc.net

  • 문제

기본적으로 20 10 35 30 7 처럼 수를 여러개 입력받는 경우 나는 먼저 배열을 생각하고 접근한다. 

그전에, 배열을 어떻게 사용하는지 알기 위해 아래를 참고하면 좋다. 

  • 크기 할당 & 초기화 없이 배열 참조변수만 선언
    int[] arr;
    int arr[];

  • 선언과 동시에 배열 크기 할당
    int[] arr = new int[5]; 
    String[] arr = new String[5];

  • 선언과 동시에 배열의 크기 지정 및 값 초기화
    int[] arr = {1,2,3,4,5}; 
    int[] arr = new int[] {1,3,5,2,4}; 
    int[] odds = {1,3,5,7,9}; 
    String[] weeks = {"월","화","수","목","금","토","일"};

  • 2차원 배열 선언
    //3의 크기의 배열을 4개 가질 수 있는 2차원 배열 할당
    int[][] arr = new int[4][3];  
    int[][] arr9 = { {2, 5, 3}, {4, 4, 1}, {1, 7, 3}, {3, 4, 5}}; 
    
    //arr[0] >> {2, 5, 3}; 
    //arr[1] >> {4, 4, 1}; 
    //arr[2] >> {1, 7, 3}; 
    //arr[3] >> {3, 4, 5};


  • 코드 1
import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        
        int N=in.nextInt();
        
        //배열 선언과 동시에 N만큼의 크기 할당
        int[] arr=new int[N];
        
        
        //index i가 0부터 N-1까지 돌아가면서 in.nextInt()를 통해 입력받은 수를 각각저장
        for(int i=0; i<N; i++){
            arr[i]=in.nextInt();
        }
        
        in.close();
        
        //입력을 수의 크기가 작은순부터 우로 정렬
        //3 9 2 4 8 -> 3 2 4 8 9
        Arrays.sort(arr);
        
        System.out.println(arr[0]+" "+arr[N-1]);
    }
}

  • 결과

어~~마무시하게 오래걸린다..


  • 코드 2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Arrays;

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());
        }
        
        br.close();
        //입력을 수의 크기가 작은순부터 우로 정렬
        //3 9 2 4 8 -> 3 2 4 8 9
        Arrays.sort(arr);
        
        System.out.println(arr[0]+" "+arr[N-1]);
    }
}

  • 결과


  • 코드 3
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));
        
        //딱 '입력만'받기에 N선언x
        Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        
        
        //탐색하고 싶은 정수의 범위설정
        int max = -1000001;
        int min = 1000001;
        
        //StringTokenizer에 사용할 수 있는 토큰이 더 있는지 확인
        //이 메서드가 ture를 반환하는 경우는 토큰이 존재하고,    
        //false를 반환하는 경우 토큰이 없다는 것
        while(st.hasMoreTokens()){ //반환토큰 존재시 while(true)처럼 동작
        
            //공백을 기준으로 띄워서 입력을 첫줄의 숫자만큼 입력한다
            int val = Integer.parseInt(st.nextToken());
            
            //입력한 숫자가 실시간으로 max보다 클경우 max에 해당 숫자저장
            if(val>max) {
                max = val;
            }
            
            //입력한 숫자가 실시간으로min보다 작을 경우 min에 해당숫자저장
		    if(val<min) {
                min = val;
            }
        }
        System.out.println(min + " " + max);
    }
}

왜 여기서 min을 최솟값, max를 최대값으로 잡는게 아닌, min과 max에 반대로 각각 최대 최소값으로 초기화 해줘야하는지 궁금했다. 

사실 간단하게 생각해보면 min이 여타 다른 정수형 변수처럼 0으로 초기화되면 입력으로 들어오는 수들중에 최솟값이지만 여전이 0보다 큰수가 있으면 min의 초기값이 0에서 변하지 않게 되버린다.

마찬가지로, max도 최솟값 줘야하는데 어마무시하게 큰값을 처음부터 줘버리면 입력한 숫자들중 최대값이 있어도 max의 데이터값을 변경시키지 못하게 된다.


  • 결과


  • 코드 1, 2, 3 성능 비교

Scanner+배열 사용
BufferedReader+배열 사용
BufferedReader 배열 미사용

 

'Computer Science > BAEKJOON JAVA Practice' 카테고리의 다른 글

[백준]1110번: 더하기 사이클  (0) 2022.01.14
[백준]10951번: A+B-4  (0) 2022.01.14
[백준]10952번: A+B-5  (0) 2022.01.13
[백준]10871번: X보다 작은 수  (0) 2022.01.13
[백준]2439번: 별 찍기 -2  (0) 2022.01.13