N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
5
20 10 35 30 7
7 35
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);
}
}
역시 어렵지 않게 푼 문제이다.
근데 이렇게 값을 하나씩 비교하지 않고도 알 수 있는 방법이 있지 않을까? 싶었다.
구글링 한 결과 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를 이용하여 배열을 만들지 않고 값을 하나씩 비교하는 방법을 사용했다. 내가 푼 방식과 비슷하지만 다른 문제. 어차피 배열의 함수를 사용해서 정렬할 것이 아니라면(값을 하나씩 비교할 것이라면) 굳이 배열을 사용하지 않고 이렇게 푸는 방법이 더 효율적인 것 같기도 하다.