💡문제 풀이/백준 - JAVA

최소, 최대 / 10818

뇌 리셋은 기본이지 2023. 11. 20. 18:19

정보

분류 : 1차원 배열

 

문제

문제링크

 

풀이

  • 풀이 1 ( Scanner + println() + 배열 ) → 1716ms
import java.util.*;

public class Main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		int[] arr = new int[n];
		int min = 0;
		int max = 0;
		int data = 0;
        
		for (int i = 0; i < arr.length; i++) {
			arr[i] = sc.nextInt();
			data = arr[i];
            
			//min,max
			if(i == 0) {
				max = data;
				min = data;
			}
			//max
			if(max < data) {
				max = data;
			}
			//min
			if(min > data) {
				min = data;
			}
		}
		System.out.printf("%s %s",min,max);
	}
}
  • 풀이 2 ( BufferedReader + BufferedWriter + Math 라이브러리 ) → 520ms
import java.io.*;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		// InputStream : 자바의 가장 기본이 되는 입력 스트림
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// OutputStreamWriter : 자바의 가장 기본이 되는 출력 스트림
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		int max = -2147000000;
		int min = 2147000000;
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		for(int i = 0 ; i < arr.length ; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
			max = Math.max(max, arr[i]);
			min = Math.min(min, arr[i]);
		};
		
		br.close();
		
		bw.write(min + " " + max);
		bw.flush();
		bw.close();
	}
}
  • 풀이 3 ( BufferedReader + BufferedWriter + 배열 ) → 520ms
import java.io.*;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		// InputStream : 자바의 가장 기본이 되는 입력 스트림
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// OutputStreamWriter : 자바의 가장 기본이 되는 출력 스트림
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		int max = 0;
		int min = 0;
		int data = 0;
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
			data = arr[i];
            
			// min,max 값 지정
			if(i == 0) {
				max = data;
				min = data;
			}
			// max
			if(max < data) {
				max = data;
			}
			// min
			if(min > data) {
				min = data;
			}
		}
		
		br.close();
		
		bw.write(min + " " + max);
		bw.flush();
		bw.close();
	}
}
  • 풀이 4 ( BufferedReader + BufferedWriter +  Arrays.stream() ) → 시간초과
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		// InputStream : 자바의 가장 기본이 되는 입력 스트림
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// OutputStreamWriter : 자바의 가장 기본이 되는 출력 스트림
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int max = 0;
		int min = 0;
		
		for(int i = 0 ; i < arr.length ; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
			// Arrays.stream(arr) : 기본 배열의 IntStream으로 변환
			//       max(), min() : 결과를 Optional 객체로 변환
			//         getAsInt() : int 값을 반환한다. 값이 없을 경우 예외 발생함.
			max = Arrays.stream(arr).max().getAsInt();
			min = Arrays.stream(arr).min().getAsInt();
		};
		
		br.close();
		
		bw.write(min + " " + max);
		bw.flush();
		bw.close();
	}
}

풀이 후기

구글에 max, min 구하기 검색하니까 여러가지 방법이 나와서 몇 가지 참고하여 풀어보았다. 풀이 4는 이클립스에선 올바르게 풀리긴하는데 백준에 재출하니까 시간초과가 나왔다. 풀이 1과 3에서 사용한 배열 방식은 변수 하나하나에 값을 넣어서 풀어보았다. 풀이도 for문 구조를 알아야해서 이 또한 쉽지 않았다.🤯 풀이 1과 3을 아래의 표로 표현해보았다.

 

  • 풀이 1, 3 for문
int n = 5, min, max = 0
int[] arr = new int[5]

[ 20, 10, 35, 30, 7 ]
i < arr.length data = arr[i] i == 0 max < data min > data
0 < 5
(true)
data = arr[0]

data = 20
0 == 0
(true)
min, max = 20
20 < 20
(false)
max = 20
20 > 20
(false)
min = 20
1 < 5
(true)
data = arr[1]

data = 10
1 == 0
(false)
-
20 < 10
(false)
max = 20
20 > 10
(true)
min = 10
2 < 5
(true)
data = arr[2]

data = 35
2 == 0
(false)
-
20 < 35
(true)
max = 35
10 > 35
(false)
min = 10
3 < 5
(true)
data = arr[3]

data = 30
3 == 0
(false)
-
35 < 30
(false)
max = 35
10 > 30
(false)
min = 10
4 < 5
(true)
data = arr[4]

data = 7
4 == 0
(false)
-
35 < 7
(false)
max = 35
10 > 7
(true)
min = 7
5 < 5
(false)
- - - -
최종
min = 7, max = 35

반복문을 표로 정리하면 각 변수에 저장되는 값이나 참과 거짓을 알 수 있어 좋은 거 같다. if( i == 0 ) { ... }i가 0일 때만 실행하기 때문에 min과 max의 초기값을 설정해주는 코드라고 생각하면 될 듯 하다. 그 뒤로는 각 값을 비교하여 변수 값을 교체하며 최소값과 최대값을 추출한다.

 

이번 풀이는 ScannerBufferedReader를 이용하여 풀어보았다. 역시 성능 차이가 확연히 보여서 꾸준히 BufferedReader를 사용할 예정이다.

'💡문제 풀이 > 백준 - JAVA' 카테고리의 다른 글

최댓값 / 2562  (1) 2023.11.20
X보다 작은 수 / 10871  (1) 2023.11.20
개수 세기 / 10807  (0) 2023.11.20
A+B - 4 / 10951  (1) 2023.11.17
A+B - 5 / 10952  (1) 2023.11.17