Tuesday, October 10, 2006
자바/Java] 숫자 배열(Array): 최소값/최대값 구하기: Min Max
for문을 돌려서, 숫자 배열의 최대값 최소값을 찾는 방법이 있긴 한데 너무 번거로워서, 다음과 같은 간단한 코드를 만들어 보았습니다.
우선 숫자가 든 배열을 소팅(정렬)합니다. 그러면 첫번째 요소인 0번 요소에 최소값이, 마지막 요소에는 최대값이 들어가겠지요.
정수(int)와 실수(double) 2종류를 예로 들었습니다.
파일명: Foo.java
업데이트:
위의 소스는 coalash님께서 지적하신 대로, 소팅하는 데 시간이 걸려서 문제가 있습니다 ^^; 이것은 for문으로 값을 찾는 코드이기에 속도 문제가 없을 것입니다. 버그가 없는지 완벽하게 테스트해 보지는 못했습니다.
Collections.min() 으로도 구해보았습니다.
최소값 최대값 찾기 계산기: ▶▶ 평균 계산기, 합계 구하기, 표준편차 계산기, 중앙값; Sum Average Stdev Median Calc
우선 숫자가 든 배열을 소팅(정렬)합니다. 그러면 첫번째 요소인 0번 요소에 최소값이, 마지막 요소에는 최대값이 들어가겠지요.
배열(Array)의 최소값(Min) 최대값(Max) 구하기 예제
정수(int)와 실수(double) 2종류를 예로 들었습니다.
파일명: Foo.java
import java.util.Arrays; // Arrays.sort() 에 필요
public class Foo {
public static void main(String[] args) {
int i[] = { 124, 634, 7, 5021525, 77, 8765, -356, 0 };
Arrays.sort(i); // 배열 자체를 정렬된 순서로 변경
// 최소값(Min) 출력
System.out.println(i[0]); // 결과: -356
// 최대값(Max) 출력
System.out.println(i[i.length - 1]); // 결과: 5021525
double d[] = { 626.64, 737, 0.0, 66.71647, 2096.829, 336, 0, 0.454 };
Arrays.sort(d); // 배열 자체를 정렬된 순서로 변경
// 최소값(Min) 출력
System.out.println(d[0]); // 결과: 0.0
// 최대값(Max) 출력
System.out.println(d[d.length - 1]); // 결과: 2096.829
}
}
public class Foo {
public static void main(String[] args) {
int i[] = { 124, 634, 7, 5021525, 77, 8765, -356, 0 };
Arrays.sort(i); // 배열 자체를 정렬된 순서로 변경
// 최소값(Min) 출력
System.out.println(i[0]); // 결과: -356
// 최대값(Max) 출력
System.out.println(i[i.length - 1]); // 결과: 5021525
double d[] = { 626.64, 737, 0.0, 66.71647, 2096.829, 336, 0, 0.454 };
Arrays.sort(d); // 배열 자체를 정렬된 순서로 변경
// 최소값(Min) 출력
System.out.println(d[0]); // 결과: 0.0
// 최대값(Max) 출력
System.out.println(d[d.length - 1]); // 결과: 2096.829
}
}
업데이트:
위의 소스는 coalash님께서 지적하신 대로, 소팅하는 데 시간이 걸려서 문제가 있습니다 ^^; 이것은 for문으로 값을 찾는 코드이기에 속도 문제가 없을 것입니다. 버그가 없는지 완벽하게 테스트해 보지는 못했습니다.
public class Foo {
public static void main(String[] args) {
int i[] = { 124, 634, 7, 5021525, 77, 8765, -356, 0 };
// 최소값(Min) 출력
System.out.println(min(i)); // -356
// 최대값(Max) 출력
System.out.println(max(i)); // 5021525
}
public static int max(int n[]) {
int max = n[0];
for (int i = 1; i < n.length; i++)
if (n[i] > max) max = n[i];
return max;
}
public static int min(int n[]) {
int min = n[0];
for (int i = 1; i < n.length; i++)
if (n[i] < min) min = n[i];
return min;
}
}
public static void main(String[] args) {
int i[] = { 124, 634, 7, 5021525, 77, 8765, -356, 0 };
// 최소값(Min) 출력
System.out.println(min(i)); // -356
// 최대값(Max) 출력
System.out.println(max(i)); // 5021525
}
public static int max(int n[]) {
int max = n[0];
for (int i = 1; i < n.length; i++)
if (n[i] > max) max = n[i];
return max;
}
public static int min(int n[]) {
int min = n[0];
for (int i = 1; i < n.length; i++)
if (n[i] < min) min = n[i];
return min;
}
}
Collections.min() 으로도 구해보았습니다.
import java.util.*;
public class Foo {
public static void main(String[] args) {
// 정수
List<Integer> i = Arrays.asList(111, -513, 0, 42424, 222, 333);
System.out.println(Collections.min(i)); // -513
System.out.println(Collections.max(i)); // 42424
// 실수
List<Double> d = Arrays.asList(111.0, -513.0, 0.0, 42424.0, 222.0, 333.0);
System.out.println(Collections.min(d)); // -513.0
System.out.println(Collections.max(d)); // 42424.0
// 문자 코드 순서를 비교
String[] s = { "222", "BBB", "333", "111", "AAA" };
System.out.println(Collections.min(Arrays.asList(s))); // 111
System.out.println(Collections.max(Arrays.asList(s))); // BBB
}
}
public class Foo {
public static void main(String[] args) {
// 정수
List<Integer> i = Arrays.asList(111, -513, 0, 42424, 222, 333);
System.out.println(Collections.min(i)); // -513
System.out.println(Collections.max(i)); // 42424
// 실수
List<Double> d = Arrays.asList(111.0, -513.0, 0.0, 42424.0, 222.0, 333.0);
System.out.println(Collections.min(d)); // -513.0
System.out.println(Collections.max(d)); // 42424.0
// 문자 코드 순서를 비교
String[] s = { "222", "BBB", "333", "111", "AAA" };
System.out.println(Collections.min(Arrays.asList(s))); // 111
System.out.println(Collections.max(Arrays.asList(s))); // BBB
}
}
최소값 최대값 찾기 계산기: ▶▶ 평균 계산기, 합계 구하기, 표준편차 계산기, 중앙값; Sum Average Stdev Median Calc
tag: java
자바 | Java 프로그래밍
제안하신 정렬후 맨앞/뒤 값을 사용하는 방식은 메모리 면에서나 속도 면에서 모두 비효율적이라 생각합니다. 가장 효율적이라는 퀵소트만 해도 O(n log n) 이니까요. for 문 한번이라면 O(n)
으로 끝날 것을...
코드의 단순함을 추구하신다면 Collection 으로 변환후 min, max로 바꾸는 방식을 써보심이 어떨까요?
Arrays.sort(i);
System.out.println(i[0]);
대신
System.out.println(Collections.min(Collections.asList(i)));
가 되겠네요.
좋은 조언 감사 드립니다.
속도 문제에 대해서 신경을 쓰지 못했습니다...
(∩_∩)
<< Home