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("프로그램이 성공적으로 수행되어 종료합니다. 감사합니다.");
}
}