[세수정렬 문제]
세가지 수를 제일 낮은 순으로 출력하라~
[과거의 나]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
int j = sc.nextInt();
int k = sc.nextInt();
int h;
int [] arr = {i,j,k};
for (int index=0;index<arr.length; index++) {
for(int r=0; r<arr.length-1; r++) {
if(arr[r]>arr[r+1]) {
h = arr[r];
arr[r]= arr[r+1];
arr[r+1] = h;
}
}
}
for(int u=0; u<arr.length; u++) {
System.out.print(arr[u]+ " ");
}
}
}
배열과 버블정렬을 사용하여 비교해 가면서 정렬을 했었다.
블로그를 검색 해보니 버블정렬을 배웠었고 야무지게 써먹었다고 생각했다.
하지만 버블정렬의 시간복잡도가 O(n2) 인걸 감안했을 때 버블정렬을 사용하여 코드를 짠 것은 정렬 효율이 떨어진다. 입력 값이 늘어날 수록 속도 측면에서 좋지 않은 성과를 낼 것이다.
또한, 버블 정렬을 하나하나 입력 했기 때문에 코드의 가독성 측면에서도 좋지 않다.
[오늘의 나]
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
ArrayList<Integer> arrList = new ArrayList<>();
arrList.add(sc.nextInt());
arrList.add(sc.nextInt());
arrList.add(sc.nextInt());
arrList.sort(null);
for (int i = 0; i <3; i++) {
System.out.print(arrList.get(i)+" ");
}
}
}
상근날드에서 했던 것 처럼 ArrayList와 자바의 내장 정렬 메소드를 사용하여 구현 하였다. Java의 기본 정렬은 TimSort이며, 최악의 경우에도 O(nlogn)의 시간 복잡도를 가진다. 따라서 더 많은 숫자를 처리할 때도 효율적이다.
하지만 ArrayList 를 사용하면 약간 더 많은 메모리를 사용할 수도 있다고 한다.
[세수정렬 최적의 코드]
그러면 도대체 어떤게 제일 최적화 된 코드 일까 하고 GPT 한테 물어보니까
그냥 Math로 비교해서 하랜다... 근데 듣고보니 맞말...
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
int min = Math.min(a, Math.min(b, c)); // 최솟값
int max = Math.max(a, Math.max(b, c)); // 최댓값
int mid = a + b + c - min - max; // 중간 값
System.out.println(min + " " + mid + " " + max);
}
}
'알고리즘' 카테고리의 다른 글
17362 - 수학은 체육과목 입니다 2 (0) | 2024.11.22 |
---|---|
백준 11945 뜨거운 붕어빵 (feat.런타임 에러) (0) | 2024.11.18 |
백준 5543 상근날드 1년전 코드랑 비교하기 (0) | 2024.11.07 |
Merge Strings Alternately (0) | 2023.09.10 |
자바, 자바스크립트 난수 생성 코드 (0) | 2023.07.25 |