정보
분류 : 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의 초기값을 설정해주는 코드라고 생각하면 될 듯 하다. 그 뒤로는 각 값을 비교하여 변수 값을 교체하며 최소값과 최대값을 추출한다.
이번 풀이는 Scanner와 BufferedReader를 이용하여 풀어보았다. 역시 성능 차이가 확연히 보여서 꾸준히 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 |