본문 바로가기
알고리즘(코테)/백준(BACKJOON) 알고리즘 - 자바

[백준(BACKJOON) 알고리즘] 10818번 자바 문제풀이 - 최소, 최대

by BGwon_C 2024. 2. 18.

최소, 최대

 

※ Point : 
첫 줄에 N 정수를 입력하고, 둘째 줄에 첫 줄에서 입력한 N개만큼 정수를 입력합니다.
둘째 줄의 숫자는 배열로 입력받는데 그 배열의 0번째 요소를 최소, 최대값으로 비교할 변수에 넣고
반복문으로 배열을 순차적으로 돌면서 최소, 최대 변수랑 비교하여 더 큰수는 최대값 변수로, 더 작은 수는 최소값 변수로 넣어줍니다.
이렇게 하면 반복문을 다 돌았을 때, 해당 배열에서 가장 큰 값과 가장 작은 값만 max, min 변수에 남게 되고 해당 변수를 출력해 주면 됩니다.

 

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));
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
      
      StringTokenizer st = new StringTokenizer(br.readLine(), " ");
      
      int N = 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 maxNumber = arr[0];
      int minNumber = arr[0];
      
      for(int i = 1; i < arr.length; i++) {
        if(arr[i] < minNumber) minNumber = arr[i];
        if(arr[i] > maxNumber) maxNumber = arr[i];
      }//for
      
      System.out.print(minNumber + " ");
      System.out.print(maxNumber);
      
      br.close();
        
      bw.flush();
      bw.close();
      
    }//main
}

 

 

만약, 여기서 더 정확하게 문제를 풀고 싶다면 배열 변수에 배열의 0번째 요소가 아닌, 상수값을 할당하면 됩니다.

문제에서는 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 수여야 한다는 조건이 있기때문에,

최소최대값에 이 조건을 걸어두는 것입니다.

 

      int maxNumber = arr[0]; 
      int minNumber = arr[0]; 

 

 

      int maxNumber = -1000000; 
      int minNumber = 1000000; 

 

으로 바꿔줍니다.

이렇게 하면 조건범위 내에만 있다면 어떠한 수도 -1,000,000 보단 크기에 maxNumber에 할당이 가능하고, 어떠한 수도 1,000,000보단 작기에 minNumber에 할당이 가능합니다.

 

어찌보면 이쪽이 문제 조건에 더 합당한 방식일 수도 있겠습니다.

저는 둘 다 답변으로 제출했습니다.


 

다른 사람의 풀이

배열을 사용하지 않고 풀기

 

배열은 메모리를 많이 잡아먹고, 시간 복잡도면에서 불필요하게 시간을 낭비 때문에

입력받은 문자를 즉시 비교하는 방식을 사용할 수도 있습니다.

 

그러면 시간복잡도가 N으로 정렬할 필요가 없어 시간을 단축시킬 수 있습니다.

 

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

 

 

특이한 점은 Integer.parseInt(br.readLine());입니다.

첫 째줄에 입력받는 N개의 정수를 담을 변수를 선언하지 않았다는 것인데, 이 값은 실제로 사용되지 않기 때문입니다.

 

그리고 반복문에서 hasMoreTokens()으로 다음에 읽어들일 토큰값이 없어 false를 반환할 때까지 정수를 입력하여 if문으로 비교를 반복합니다.

 

이렇게하면 메모리 용량면에서도 효율적이고, 여기에 상대적으로 Scanner보다 빠른 BufferedReader를 같이 사용하면 배열에 비해 시간복잡도가 훨씬 단축되는 이점이 있습니다.

 

또한 여기서도 max, min 변수 비교를 위해 초기화를 각각 -1000001과 1000001으로 해주었습니다.

 


 

※ 참고문서 : 

댓글