IT/JAVA

선택정렬

_KH_ 2025. 1. 6. 08:53

[그림]

 

[선택정렬]

// 한글코딩

        // 스캐너 변수 선언
        // 랜덤 변수 선언
        // 변수 배열크기 선언

        // 계속 반복: //유효성 검사
        // "배열의 크기를 입력하세요" 출력
        //  배열크기에 사용자 입력
        //  만약 옳은 입력이라면 // 배열크기가 2이상상
        //  종료
        //  "다시 입력해주세요" 출력
        
        // 정수형 배열 리스트 선언 및 배열크기로 초기화
        
        // 반복 배열의 크기만큼: // 배열에 요소 입력
        // 진위형 변수 플래그 모든요소중복 선언, 참으로 초기화
        // 만약 입력받은 크기가 2이상 6이하라면
        // "원하시는 정수 n개를 말해주세요!" 출력
        //  반복 배열의 크기만큼
        //  배열의 현재 위치에 사용자 입력
        //  만약 배열의 첫번째 요소와 다른 요소가 있다면
        //    모든요소중복 거짓
        //  입력받은 크기가 7이상이라면
        //  "편의를 위해 값을 랜덤으로 할당합니다"
        //  반복 배열의 크기만큼 
        //  배열의 현재 위치에 랜덤 값을 대입 
        //  만약 배열의 첫번째 요소와 다른 요소가 있다면
        //  모든요소중복 거짓
        //
        //  만약 모든요소중복 이 거짓이라면
        //   루프 탈출 // 종료조건 
        //

        // 진위형 변수 플래그 선언 //정렬할 게 없는 상태 가정, scope문제로 위에 선언
        // 반복 0부터 배열의 크기까지:
        // 변수 최솟값의인덱스 선언 및 최솟값
        // 반복 배열의 현재 인덱스부터 배열 크기까지: //최솟값 구하기
        // 만약 최솟값이 현재 요소보다 작다면:
        // 최솟값 업데이트
            
        //  최솟값과 현재값이 같지 않다면
        //  //교환 알고리즘 적용
        //  배열의 i번째와 배열의 최솟값의 인덱스 번째 요소 교환  
        //         
        // "n회전 선택정렬 완료" 출력
        //  반복 배열의 요소만큼:
        //  배열의 요소 출력
        //  플래그 거짓 대입 // 정렬할게 있다면 false로 변경
        // 만약 정렬 할게 없다면 // 플래그가 참이면
        //    " 정렬을 완료했으나 이미 정렬이 완료된 상태입니다." 출력 
        // 감사합니다 출력

 

 

[코드 작성]

  Scanner sc = new Scanner(System.in); // 스캐너 변수 선언
	      Random rand = new Random(); // 랜덤 변수 선언

	      int times; // scope 문제로 정수의 개수 변수 위에 선언
	      while(true) { // 옳게 입력하는데 몇번이 걸릴지 모른다
	         System.out.println("원하시는 정수의 개수를 말해주세요!");
	         System.out.print("정수의 개수: ");
	         times = sc.nextInt(); // 정수의 개수 저장

	         if(2<=times) { // 비교를 하기 위해 2개 이상
	            System.out.println("정수의 개수를 "+times+"개로 진행합니다."); // 검사 통과 안내
	            break;
	         }
	         System.out.println("개수는 양수이며 비교를 위해서는 최소 2개가 필요합니다."); // 에러 안내
	      }

	      int[] numDatas = new int[times]; // 사이즈가 times인 int 배열

	      while(true) {
	         boolean overlapFlag = false; // 모든 값이 동일한 상태 가정, scope문제로 위에 선언

	         if(times <= 6) { // 2 이상 6 이하라면
	            System.out.println("원하시는 정수 "+times+"개를 말해주세요!");
	            System.out.print("입력 : ");

	            numDatas[0] = sc.nextInt(); // 입력받은 값을 numDatas[0]에 저장

	            for(int i=1; i<times;i++) {
	               numDatas[i] = sc.nextInt(); // 입력받은 값을 numDatas[i]에 저장
	               if(numDatas[0] != numDatas[i]) { // 중복이 아니라면?
	                  overlapFlag = true; // true로 값 변경
	               }
	            }
	         }
	         else { // 7 이상이라면
	            System.out.println("원하시는 정수 "+times+"개를 편의를 위해 값을 랜덤으로 저장합니다!");
	            numDatas[0] = rand.nextInt(101); // 입력받은 값을 numDatas[0]에 저장
	            for(int i=1; i<times;i++) { // 랜덤 값을 numDatas[]에 저장
	               numDatas[i] = rand.nextInt(101); // 0~100

	               if(numDatas[0] != numDatas[i]) { // 중복이 아니라면?
	                  overlapFlag = true; // true로 값 변경
	               }
	            }
	         }

	         if(overlapFlag) { // 탈출 조건
	            break;
	         }

	         System.out.println("모든 정수가 동일합니다! 다시 값을 저장합니다."); // 에러 안내
	      }

	      System.out.print("입력된 정수: [ ");
	      for(int v : numDatas) { // numDatas[] 전체 출력
	         System.out.print(v+" ");
	      }
	      System.out.println("]");

	      boolean runFlag= true; // 정렬할 게 없는 상태 가정, scope문제로 위에 선언
	      
	      for(int i=0; i<times; i++) {
	         int minIndex = i; // 가장 작은 수의 위치를 i로 설정
	         for(int j=i+1; j<times; j++) {
	            if(numDatas[minIndex] > numDatas[j]) { // i위치보다 작은 값이 있다면
	               minIndex=j; // 가장 작은 수의 위치를 j로 변경
	            }
	         }
	         
	         if(numDatas[i] > numDatas[minIndex]) { // 만약 값이 똑같지 않다면
	            // 교환 알고리즘
	            int tmp = numDatas[i];
	            numDatas[i] = numDatas[minIndex];
	            numDatas[minIndex] = tmp;

	            System.out.print((i+1)+"회전 선택정렬 완료 : [ "); // 회전에 따른 변화 시각화
	            for(int v : numDatas) { // 정렬된 numDatas[] 전체 출력
	               System.out.print(v+" ");
	            }
	            System.out.println("]");
	            
	            runFlag = false; // 정렬할게 있다면 false로 변경
	         }
	         
	      }
	      if(runFlag) { // 정렬할게 없다면 안내
	         System.out.println("정렬을 완료했으나 이미 정렬되어있는 상태입니다.");
	      }
	      
	      System.out.println("프로그램이 성공적으로 수행되어 종료합니다. 감사합니다.");

	}

}