문제는 위와 같다.
내 첫 시도:
import java.util.Scanner;
public class beakjoon_array01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count =sc.nextInt();
int [] num = new int[count];
int min = 0;
int max = 0;
for(int i=0; i<num.length; i++) {
num[i]=sc.nextInt();
}
if(num[0]<=num[1]) {
min = num[0];
} else {
min = num[1];
}
for(int i = 1; i<num.length;i++){
if(min<=num[i]) {
min = min;
} else {
min = num[i];
}
}
if(num[0]<=num[1]) {
max = num[1];
} else {
max = num[0];
}
for(int i = 1; i<num.length;i++){
if(max<=num[i]) {
max = num[i];
} else {
max = max;
}
}
System.out.println(min + " " + max);
}
}
예제와 같이 입력해 실행해 보았을 때 예제 출력이 올바르게 나왔으나, 런타임 에러 (ArrayIndexOutOfBounds)가 났다.
내가 생각해도 꾸역꾸역 코드를 길게 써서 예제만 맞췄다고 생각돼, 다시 시도 해본다..
배열을 오름차순으로 재 배치를 해서 맨 앞의 인덱스의 값을 최소값, 맨 뒤의 인덱스의 값을 최대값으로 출력하면 될 것 같다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count =sc.nextInt();
int [] num = new int[count];
for(int i=0; i<num.length; i++) {
num[i] =sc.nextInt();
}
for(int i = 0; i<num.length; i++) {
for (int j = i+1; j<num.length; j++) {
if(num[i]>num[j]) {
int s = num[i];
num[i]= num[j];
num[j]= s;
}
}
}
System.out.println(num[0]+ " " + num[num.length-1]);
}
}
이번엔 시간초과로 틀렸다.
예제의 출력물은 올바르게 나왔는데, 아무래도 너무 느린 알고리즘을 짠 것 같다.
문제 그대로 오름차순을 이용하지 말고 그대로 최소, 최대만 바로 구할 수 있는 코드를 짜 보겠다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count =sc.nextInt();
int [] num = new int[count];
for(int i=0; i<num.length; i++) {
num[i]=sc.nextInt();
}
int min = num[1];
int max = num[1];
for(int i = 1; i<num.length;i++){
if(min<=num[i]) {
min = min;
} else {
min = num[i];
}
}
for(int i = 1; i<num.length;i++){
if(max<=num[i]) {
max = num[i];
} else {
max = max;
}
}
System.out.println(min + " " + max);
}
}
첫 시도에 짠 코드를 줄여봤는데 역시나 틀렸다. 이번엔 그냥 책<자바의 정석>예제 5-6을 참고 해보겠다.
나중에 보니 초기화 값이 틀려서 틀렸던 코드였다.
int min = num[1];
int max = num[1];
대신
int min = num[0];
int max = num[0];
을 입력해 주면 맞을 수 있었다.
마지막 정답:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count =sc.nextInt();
int [] num = new int[count];
for(int i=0; i<num.length; i++) {
num[i]=sc.nextInt();
}
int min = num[0];
int max = num[0];
for(int i=1; i< num.length; i++) {
if(num[i]> max) {
max =num[i];
} else if(num[i]<min) {
min =num[i];
}
}
System.out.println(min + " " + max);
}
}
드디어 맞았다.
최대값과 최소값 구하는 법1. 배열의 첫 번째 요소인 num[0]의 값으로 최대값을 의미하는 변수 max와 최소값을 의미하는 변수 min을 초기화 2. 그 다음 반복문을 통해 배열의 두 번째 요소 num[1] 부터 max, min 의 값과 비교 해 크거나 작으면 이 값을 max, min에 저장. 3. 이런식으로 배열의 마지막 요소까지 비교하고 나면 max, min에 배열에 담긴 값중 최대값, 최소값이 저장된다. |
무려 3번의 시행착오 끝에 정답!
초기화나 작은 숫자들에 유의해서 보고,
빠른 알고리즘, 간단한 코드를 생각할것!
'자바 기초 > 백준 예제' 카테고리의 다른 글
[프로그래머스] 입양 시각 구하기(1) Oracle (0) | 2021.03.18 |
---|---|
백준 2577번) 배열 숫자의 개수 (자바) (0) | 2021.02.13 |
백준 2562번) 배열 최댓값 (자바) 오답노트 (0) | 2021.02.12 |