자바 기초/백준 예제

백준 10818번) 배열 최대, 최소 문제 (자바) 오답노트

문에딕트 2021. 2. 12. 20:00

문제는 위와 같다.

 

내 첫 시도:

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번의 시행착오 끝에 정답!

초기화나 작은 숫자들에 유의해서 보고, 

빠른 알고리즘, 간단한 코드를 생각할것!