[★2][백준10818번]최소, 최대 (JAVA)

Date:     Updated:

카테고리:

태그:

[★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 7
      7 35

내가 푼 풀이

이번 문제는 배열에 담아 최솟값과 최댓값을 출력하는 식으로 구현을 하였고, 배열 내에 있는 최솟값과 최댓값은 크게 3가지 방법으로 구할 수 있다. 첫 번째 방식은 ScannerArrays.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가 훨씬 성능이 좋음을 알 수 있다.

BKJN 카테고리 내 다른 글 보러가기

댓글 남기기