예제
public class Algorithm {
public static void main(String[] args) {
//[1] : 배열 선언
int[] ar = {4, 13, 15, 17, -2};
//[2] : max, min 함수
System.out.println(Math.max(10, 4)); // 10
System.out.println(Math.min(10, 4)); // 4
//[3] : 배열내 첫번째 원소의 값이 제일 크고 작다고 가정하고 초기화
int max = ar[0];
int min = ar[0];
//[4] : 반복문을 이용해 비교하여 출력
System.out.println("max에 저장된 초기값 : " + max);
System.out.println("min에 저장된 초기값 : " + min);
for (int i = 0; i < ar.length; i++) {
if (max < ar[i]) {
max = ar[i];
}
if (min > ar[i]) {
min = ar[i];
}
}
System.out.println("현재 배열내 가장 큰 값 : " + max);
System.out.println("현재 배열내 가장 작은 값 : " + min);
}
}
max에 저장된 초기값 : 4
min에 저장된 초기값 : 4
현재 배열내 가장 큰 값 : 17
현재 배열내 가장 작은 값 : -2
배열에서 최대값 구하는 알고리즘
1. 배열 선언과 초기화.
- 먼저, 정수로 이루어진 배열을 선언하고 초기값을 할당한다. 배열은 중괄호 "{}" 안에 각 원소들을 쉼표로 구분하여 나열한다.
- 예제에서 "int[] ar = {4, 13, 15, 17, -2};" 와 같이 배열 "ar"을 선언하고 초기값을 할당하였다.
2. Math 클래스의 max, min 함수사용
- Math.max(a, b) 는 주어진 두 수 , "a 와 b" 중 더 큰 값을 반환하는 함수이다.
- Math.min(a, b) 는 주어진 두 수 , "a 와 b" 중 더 작은 값을 구반환하는 함수이다.
3. 최대값, 최소값 변수 초기화
- 최대값과 최소값을 찾기 위해 초기값으로 배열의 첫 번째 원소를 설정한다.
- 예제에서는 "int max = ar[0];" 와 "int min = ar[0];" 같이 "max" 와 "min" 변수를 선언하고 배열의 첫 번째 원소를 max 와 min 에 할당한다.
4. 반복문을 이용한 최대값, 최소값 찾기
- 배열의 모든 원소와 초기값인 max,min를 비교하여 더 큰값과 더 작은값이 있으면 max, min를 갱신한다.
- 예제에서는 for 반복문을 사용하여 배열 "ar" 의 모든 원소를 순회하면서 "max, min" 각각 원소를 비교하고, 더 큰 값과 더 작은 값이 있을경우 각각 max와 min을 해당 원소 값으로 업데이트한다.
5. 최대값, 최소값 출력
- 반복문이 끝난 후, max 변수에는 배열 내 가장 큰 값, min 변수에는 배열 내 가장 작은 값이 저장되어, System.out.println("현재 배열내 가장 큰 값 : " + max); 와 System.out.println("현재 배열내 가장 작은 값 : " + min); 같이 최대값, 최소 값을 출력한다.
심화적인 내용
- 이 알고리즘은 배열의 크기에 선형적으로 비례하는 시간 복잡도를 가지며 O(n)의 성능을 가진다. 이는 배열 내의 모든 원소를 한 번씩 순회하기 때문에, 이러한 선형 시간 복잡도로 인해 배열이 커지면 성능에 영향을 미칠 수 있다.
- 알고리즘의 효율성을 높이기 위해, 입력 배열이 크거나 알고리즘을 여러 번 사용해야 하는 경우에는 효율적인 알고리즘을 사용하는 것이 중요하다. 배열이 정령되어 있는 경우에는 최대값, 최소값을 더 간단하고 빠르게 찾을 수 있는 방법들이 있다.
- 최대값 최소값을 동시에 찾기 위해 두 변수를 사용하는 방법은 효율적인 방법이지만, 두 변수를 따로따로 순회하면 찾는 방법도 있다. 이 경우 시간 복잡도는 여전히 O(n)이지만, 두 번의 반복문이 필요하므로 상수항이 늘어날 수 있다.
- 최대값을 구하는 방법 중에는 정렬 알고리즘을 사용하는 방법도 있으며, 배열을 정렬한 후 에는 가장 큰 값이 배열의 마지막 원소에 위치하게된다. 따라서 정렬을 이용하여 최대값을 찾을 때의 시간 복잡도는 배열을 정렬하는 데 소요되는 시간에 좌우된다. 일반적으로 효율적인 정렬 알고리즘을 사용하면 O(n log n)의 시간 복잡도를 가진다.
주의점
- 배열의 크기가 0인 경우, 즉 빈 배열인 경우에는 최대값, 최소값을 찾을 수 없다. 따라서 이 경우에는 예외 처리를 해주어야 한다.
- 배열의 원소가 모두 음수인 경우에도 최대값을 찾을 수 있다. 초기값으로 0를 사용하지않고 "int max = Integer.MIN_VALUE;" 와 같이 "Integer" 자료형이 표현할 수 있는 가장 작은 값으로 초기화하는 것이 좋다. 이렇게 하면 배열에 음수만 있더라도 제대로 된 최대값을 구할 수 있다.
- 배열의 원소가 정수가 아닌 다른 데이터 타입인 경우에는 해당 타입에 맞는 초기값을 사용해야 한다. 예를 들어, 배열이 실수형 데이터를 가지고 있다면 "duble max = Double.NEGATIVE_INFINITY;" 와 "duble min = Double.POSITIVE_INFINITY;" 같이 초기화 해야한다.
'Java > JAVA 100 문제 풀이' 카테고리의 다른 글
자바 part.4 문제풀이 - 성적 오름차순 정렬하기: Arrays.sort() 메서드 활용 (0) | 2023.07.28 |
---|---|
자바 part.4 문제풀이 - 랜덤 정수 배열에서 최소값과 최대값 구하기 (0) | 2023.07.28 |
자바 part.4 문제풀이 - 다형성 이해 : 객체 배열과 매개변수 활용 (0) | 2023.07.27 |
자바 part.4 문제풀이 - 다형성과 추상 클래스를 이용한 객체 배열 생성과 활용 (0) | 2023.07.27 |
자바 part.4 문제풀이 - 추상 클래스를 이용한 다형성 구현 (0) | 2023.07.27 |