Back-End

[JAVA] 선택 정렬 함수 이용해서 코드짜기

Minch13r 2025. 1. 8. 17:45
[한글 코딩]
배열 크기 입력받으려고 스캐너 클래서 가져옴
배열에 랜덤으로 수를 입력받으려고 랜덤 클래서 가져옴

배열 크기를 1~10으로 정했으니까
아래 명령 계속{                                              ==> 배열 크기 입력받는거 함수화
   "배열의 크기를 입력하세요"
   입력 받음
   만약(사이즈가 0보다 크고 10보다 작거나 같으면)
      탈출
}
   아니면 경고 문구 출력
}

   입력받은 사이즈 크기의 배열 생성

   사이즈 크기 만큼 난수 생성(   // 난수 1~100까지   ==> 난수 생성 함수화
      아래 명령 실행{
      flag = false로 두고    // 중복 아닌 상태
      배열에 난수 생성
      }   

      생성된 난수 중복 검사
)

정렬 전 
배열 출력     ==> 배열 출력 함수화


1 입력하면 오름차순 정렬
2 입력하면 내림차순 정렬

아래 명령 계속{                  ==> 오름차순, 내림차순 선택하는거 함수화
   1. 오름차순 출력
   2. 내림차순 출력
   입력 받음

   만약(1이나 2 입력받으면){
      그만 입력받아
}
   경고 문구 출력               

}


배열 크기 -1회전 반복{            ==> 선택정렬 함수화
만약(1 입력받으면){
   가장 작은 수를 맨 왼쪽에 넣을거니까
   맨 왼쪽을 변수로 두고
   두 번재 수부터 오른쪽 수들을 
   변수 자리값이랑 비교해서
   가장 작은 수의 자리값을 선택해서 변수와 자리를 바꿈  => 1회전

   0번 인덱스를 제외하고 1번 인덱스를 변수로 두고
   2번 인덱스부터 오른쪽 수들을
   변수 자리값이랑 비교해서
   가장 작은 수의 자리값을 선택해서 변수와 자리를 바꿈 => 2회전   
}
아니면{
   선택 정렬로 내림차순
}
n회전때마다 정렬된 배열 출력

}

최종 정렬된 
배열 출력       ==> 함수화

package day008;

import java.util.Random;
import java.util.Scanner;

public class Selectionsort {
    //배열의 크기를 사용자가 입력하는 함수
    public static int inputSize(Scanner scanner, int size) {
        while (true) {
            System.out.print("배열의 크기를 입력하세요 (1~10): ");
            size = scanner.nextInt(); // 배열 크기 입력받음
            if (size > 0 && size <= 10) { // 1부터 10 사이만 입력 가능
                break;
            }
            System.out.println("잘못된 크기입니다. 1~10 사이의 숫자를 입력해주세요.");
        }
        return size;
    }

    // 배열 안의 숫자를 랜덤으로 생성해주고, 중복 방지하는 함수
    public static void flagTest(int[] datas, Random random) {
        for (int i = 0; i < datas.length; i++) {
            while (true) {
                boolean flag = false; // boolean 형식으로 중복 확인
                datas[i] = random.nextInt(100) + 1; // 1~100 사이의 랜덤 숫자

                // 중복 검사
                for (int j = 0; j < i; j++) {
                    if (datas[j] == datas[i]) {
                        flag = true; // 중복인 경우
                        break; // 중복이면 다시 반복
                    }
                }

                // true로 설정해서 if문 통과
                if (!flag) { // 중복이 아닌 경우
                    break;
                }
            }
        }
    }

    // 배열 출력하는 함수
    public static void printArr(int[] datas) {
        for (int num : datas) {
            System.out.print(num + " ");
        }
        System.out.println();
    }

    // 오름차순, 내림차순 선택하는 함수
    public static int ascOrdesc(int ans, Scanner scanner) {
        while (true) {
            System.out.println("\n정렬 방식을 선택하세요:");
            System.out.println("1. 오름차순");
            System.out.println("2. 내림차순");
            System.out.print("선택 >> ");
            ans = scanner.nextInt();

            if (ans == 1 || ans == 2) { // 1 또는 2가 아닐 경우
                break;
            }
            System.out.println("잘못된 선택입니다. 1 또는 2를 선택해주세요.");
        }
        return ans;
    }

    // 선택 정렬하고 n회차 별로 배열 출력하는 함수
    public static void selectionSort(int[] datas, int ans) {
        for (int i = 0; i < datas.length - 1; i++) {
            int targetIndex = i;

            // 오름차순 / 내림차순 선택하기
            for (int j = i + 1; j < datas.length; j++) {
                if (ans == 1) { // 오름차순
                    if (datas[j] < datas[targetIndex]) {
                        targetIndex = j;
                    }
                } else { // 내림차순  가독성 좋게 하려고 else 넣어둠
                    if (datas[j] > datas[targetIndex]) {
                        targetIndex = j;
                    }
                }
            }

            // 값 교환
            if (targetIndex != i) {
                int tmp = datas[i];
                datas[i] = datas[targetIndex];
                datas[targetIndex] = tmp;
            }

            // 각 회차별 정렬 과정 출력
            System.out.println((i + 1) + "회전 후 배열");
            printArr(datas);
        }
    }

    public static void main(String[] args) {

        // 스캐너와 랜덤 객체 생성
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

        int size = 0;  // 배열 크기

        size = inputSize(scanner, size);   //배열 크기 입력받기

        // 배열 생성
        int[] datas = new int[size]; //배열 크기 size를 넣음으로써 배열 크기 사용자 설정

        // 중복 없이 1~100 사이의 랜덤 숫자로 배열 채우기

        flagTest(datas, random); //중복 검사

        // 정렬 전 배열 출력
        System.out.println("\n정렬 전 배열:");
        printArr(datas);   //배열 출력

        // 정렬 방식 선택
        int ans = 0; // scope 이슈

        ans = ascOrdesc(ans, scanner);  //1. 오름차순, 2. 내림차순 입력 받기

        selectionSort(datas, ans);   // 선택 정렬 후 회전마다 출력

        // 최종 정렬된 배열 출력
        System.out.println("\n최종 정렬된 배열:");
        printArr(datas);   //배열 출력
    }
}​

main 함수에다가 scanner와 random 객체를 생성하지 않고 필요한 함수에다 객체를 생성하고 진행하면 어떨까? 그리고 변수에다가 초기화하지 말고 함수를 할당해 초기화와 동시에 대입을 하면 더 좋을 것 같다는 생각이 들었다.

 

main 함수에다가 scanner와 random을 생성하고 인자를 함수에다가 가져온다면 메모리 사용량에 있어서 더 좋은 점이 있지만 웹개발 지향적으로 봤을 때 main에다가 Scanner scanner = new Scanner(System.in);이라고 선언했을 때 함수에서는 인자를 'scanner' 로만 갖고 와야 한다는 단점이 있다. 하지만 함수에서 선언했을 때 sc, scan 등 여러가지로 쓸 수 있게 만들 수 있다는 장점이 있다. 메모리로만 봤을 때는 main에 넣는게 더 낫지만 결합도를 낮추기 위해서는 main 말고 각 함수에 넣는게 더 낫다.