[★2][백준10818번]최소, 최대 (JAVA)
10818번 문제 ☞ https://www.acmicpc.net/problem/10818
난이도 ☞ [★2]
최소, 최대
문제
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
예제입력 예제출력 5
20 10 35 30 77 35
내가 푼 풀이
이번 문제는 배열에 담아 최솟값과 최댓값을 출력하는 식으로 구현을 하였고, 배열 내에 있는 최솟값과 최댓값은 크게 3가지 방법으로 구할 수 있다. 첫 번째 방식은 Scanner
와 Arrays.sort()
로 구현하였다. 코드는 아래와 같다.
[ 풀이 1 ]
메모리 :
323288KB
시간 :2480ms
Scanner + Arrays.sort()
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = s.nextInt();
}
s.close();
Arrays.sort(arr);
System.out.print(arr[0] + " ");
System.out.println(arr[arr.length - 1]);
}
}
Scanner
방식이라 그런지 생각보다 채점시간도 매우 오래 걸렸다. 우선, 이어서 두번째 방식은 for
문을 통하여 값을 출력하는 방법입니다. 코드는 아래와 같습니다.
[ 풀이 2 ]
메모리 :
318764KB
시간 :1752ms
Scanner + for
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = s.nextInt();
}
s.close();
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
System.out.print(min + " ");
System.out.println(max);
}
}
풀이 3번은 Stream
을 이용한 방법입니다. Arrays.stream()
으로 스트림을 만들어준 뒤에 max()
와 min()
으로 최솟값과 최댓값을 구하고, getAsInt()
로 꺼내오면 된다. 코드는 아래와 같다.
[ 풀이 3 ]
메모리 :
318536KB
시간 :1772ms
Scanner + Arrays.stream()
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = s.nextInt();
}
s.close();
System.out.println(Arrays.stream(arr).min().getAsInt() + " "); // 최소값을 구함
System.out.print(Arrays.stream(arr).max().getAsInt()); // 최대값을 구함
}
}
마지막으로 풀이 4번은 Scanner
말고 성능이 더 좋은 BufferedReader
와 배열없이 한번 구현해보도록 하려고 한다. 하지만 문제의 카테고리가 배열이라는 점을 고려하여야 하며 이 풀이는 배열에 담을 필요가 있나라는 생각이 들어 풀어보게 되었다. 코드는 아래와 같으며, 주의해야할 사항이 존재한다.
[ 풀이 4 ]
메모리 :
90484KB
시간 :588ms
BufferedReader + 배열 X
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 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 v = Integer.parseInt(st.nextToken());
if (v < min) {
min = v;
}
if (v > max) {
max = v;
}
}
System.out.println(min + " " + max);
}
}
위의 코드에서 보다시피 StringTokenizer st = new StringTokenizer(br.readLine(), " ");
의 위치를 주의해야 한다. 처음으로 값을 받는 Integer.parseInt(br.readLine());
앞에 작성할 경우 오류가 나게 된다. 확실하게 눈에 띄게 BufferedReader
+ 배열 X
가 훨씬 성능이 좋음을 알 수 있다.
'Coding Test > 백준' 카테고리의 다른 글
[★2][백준10871번 for JAVA]X보다 작은 수 (0) | 2023.03.25 |
---|---|
[★2][백준10807번 for JAVA]개수 세기 (0) | 2023.03.24 |
[★2][백준1110번 for JAVA]더하기 사이클 (0) | 2023.03.23 |
[★1][백준10952번 for JAVA]A+B - 4 (0) | 2023.03.22 |
[★1][백준10952번 for JAVA]A+B - 5 (0) | 2023.03.21 |
댓글