개발자는 기록이 답이다

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_선택정렬) 본문

알고리즘/인프런 - Java알고리즘 입문

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_선택정렬)

slow-walker 2023. 10. 1. 11:23

1. 선택정렬

 

예시 입력 1 

6
13 5 11 7 23 15

예시 출력 1

5 7 11 13 15 23

 

 

선택정렬

 

선택 정렬(Selection Sort)은 간단하고 기본적인 정렬 알고리즘 중 하나입니다. 이 알고리즘은 주어진 배열에서 가장 작은 (또는 가장 큰) 요소를 선택하여 해당 위치로 이동시키는 방식으로 동작합니다. 선택 정렬은 비교적 간단하지만 효율성이 떨어지므로 큰 데이터셋에 대해서는 비효율적일 수 있습니다. 


1. 배열에서 최소값(또는 최대값)을 찾습니다.
2. 최소값을 현재 위치와 교환합니다.
3. 다음 위치로 이동하고 위의 두 단계를 반복합니다.

// 배열을 순회하면서 최소값을 찾아 현재 위치와 교환하는 과정을 반복하여 배열을 정렬합니다.

public class SelectionSort {
    public static void selectionSort(int[] arr) {
        int n = arr.length;

        for (int i = 0; i < n - 1; i++) {
            int minIndex = i;

            // 현재 위치부터 배열 끝까지 최소값을 찾음
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }

            // 현재 위치와 최소값 위치를 교환
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

    public static void main(String[] args) {
        int[] arr = {64, 25, 12, 22, 11};
        System.out.println("원래 배열: " + Arrays.toString(arr));

        selectionSort(arr);

        System.out.println("정렬된 배열: " + Arrays.toString(arr));
    }
}


 

강의 풀이(Time: 161ms Memory: 27MB)

 

i 가 제일 앞일때, j는 1부터 끝까지 쭈욱 순회합니다. 오름차순이니까 맨 앞에 제일 작은 숫자를 둬야 합니다.

0번 위치에 올 수있는 제일 작은 숫자 최솟값를 찾아내야 합니다. 그러기 위해 idx번호가 있어야 합니다.

처음에는 id에 i값을 놓습니다. 그리고 나서 jfor문이 도는데 i+1부터 돌면서 idx의 값을 찾으면 됩니다.

idx에는 i번째부터 끝까지 가장 작은 숫자인 위치의 인덱스를 저장해야 합니다.

 

i가 고정된 상태에서 j가 계속 돌고 있는건데, arr[j]가 arr[idx]보다 작으면 idx에 j를 재할당해줍니다.

j for문을 돌아도 arr[idx]보다 더 작은 것을 못 찾으면 arr[idx]값과 arr[i]값을 교환해줘야합니다.

 i번째에 들어올 숫자를 찾고 있는 과정입니다. 그 숫자의 인덱스 번호가 Idx입니다. 

다시 말해서 i 번째로 옮겨야 할 숫자의 인덱스번호가 idx입니다. 그래서 arr[i]와 arr[idx]를 스와프 해줍니다.

그다음에는 이제 i가 증가하고 j는 i+1부터 for문을 돌기 시작합니다.

 

이렇게 계속 i번째 올 숫자를 찾아주면, 오름차순 했을때 처럼 i번째 올 숫자부터 정렬되어있습니다.

 

    // 내장함수로 오름차순하는 방법이외에 선택정렬 하는 방법도 알아야함!
    public int[] solution(int n, int[] arr ){
        Arrays.sort(arr);
        return arr;
    }
import java.util.Scanner;

public class Main {

    public int[] solution(int n, int[] arr ){
        // i가 마지막 자료까지 돌 필요없다.
        // 왜냐하면 i의 값이 23이고 마지막 값이 17이라고 하면 어차피 스와프해줘야하므로 i가 17까지 갈 필요 없음
        // 한번이라도 덜 돌기 하기 위함
        for (int i = 0; i < n-1; i++) {
            int idx = i;
            for (int j = i+1; j < n; j++) {
                // jfor문을 다 돌고 나면 가장 작은 값을 가진 인덱스 번호가 idx에 저장된다
                if (arr[j] < arr[idx]) idx = j;
            }
            // 뒤로 옮겨줄 arr[i]값을 tmp변수에 할당
            int tmp = arr[i];
            // 최솟값 찾은걸 arr[i]에 재할당하면서 스와프
            arr[i] = arr[idx];
            // 16 라인에서 찾은 값을 arr[idx]에 스와프
            arr[idx] = tmp;
        }
        return arr;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = kb.nextInt();
        }
        for (int x : T.solution(n, arr)) {
            System.out.print(x + " ");
        }
    }
}