[Java][BOJ] 최소, 최대

Ga02·2023년 9월 2일
0

BOJ

목록 보기
45/62

문제

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

입력

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

출력

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

예제입력1

5
20 10 35 30 7

예제출력1

7 35

My Solution

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

public class Main {
	public static void main(String[] args) throws NumberFormatException, 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<arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		int max = arr[0];
		int min = arr[0];
		for(int i : arr) {
			max = Math.max(max, i);
			min = Math.min(min, i);
		}
		System.out.println(min + " " + max);
	}

}

👀 Comment

역시 어렵지 않게 푼 문제이다.
근데 이렇게 값을 하나씩 비교하지 않고도 알 수 있는 방법이 있지 않을까? 싶었다.

구글링 한 결과 Arrays.sort(arr) 을 사용해서 정렬을 한 후 0번째 인덱스와 마지막 인덱스의 값을 출력하는 방법이 있었다. 이건 생각하지 못한 방법이었지만, 이 분이 다른 코드로도 작성해서 시간복잡도를 비교해본 결과 내가 푼 방식이 시간이 덜 소요되었다.
배열을 사용하여 정렬을 하면 코드로는 훨씬 간단하지만 시간복잡도면에서는 효율성이 좋지 않은 것이다.


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

Integer.parseInt(br.readLine());	//첫 줄 N 은 안쓰이므로 입력만 받는다.
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);

내가 푼 방식처럼 값을 하나씩 비교햇지만 배열을 사용하지 않은 버전이다.

max와 min을 선언할 때 조건에서 주어진 최소와 최대값으로 설정해주고, st를 이용하여 배열을 만들지 않고 값을 하나씩 비교하는 방법을 사용했다. 내가 푼 방식과 비슷하지만 다른 문제. 어차피 배열의 함수를 사용해서 정렬할 것이 아니라면(값을 하나씩 비교할 것이라면) 굳이 배열을 사용하지 않고 이렇게 푸는 방법이 더 효율적인 것 같기도 하다.

profile
IT꿈나무 댓츠미

0개의 댓글