자바의 정석 예제 5-10
Q. int arr = new [10]일때 Math.random()으로 임의 값을 넣고, 이 숫자들을 정렬하는 문제.
단순히 값끼리 교환해서 자리를 찾아가는것 뿐만 아니라, 범위값도 신경써서 지정해줘야 한다는게 포인트였다.
public static void main(String[] args) {
int [] numArr= new int[10];
for (int i=0; i<numArr.length; i++) {
System.out.print(numArr[i]= (int)(Math.random()*numArr.length));
} // 인덱스 0~9에 )~10의 랜덤값을 넣는다
System.out.println();
System.out.println();
// ----- 여기까진 무난하게 가능 -----
// 행이든 열이든 비교 횟수는 전체 자리수 -1 이다.
for (int i=0; i<numArr.length-1; i++) {// 마지막 최종정렬 배열제외한 횟수만큼 돈다
boolean changed = false; // 자리바꿈이 발생했는지 체크. 매 반복마다 초기화됨
for(int j=0; j<numArr.length-1-i; j++) {
//i=0일때 마지막자리 확정1, i=1일때 뒤에서 2자리 확정. 즉 마지막 자리부터 확정되는 개수 -1 + -i
if(numArr[j]> numArr[j+1]) { // 앞의 인덱스가 뒤 인덱스보다 크면 서로 바꿈
int tmp= numArr[j];
numArr[j]= numArr[j+1];
numArr[j+1]= tmp;
changed =true;
}//if ends
} // j ends
if (!changed)
break;
for (int k=0; k<numArr.length; k++) {
System.out.print(numArr[k]);
}
System.out.println();
}// for ends
} //end of main
내부 for문이 돌면서 가로로 모든 숫자를 비교하게 되고, 마지막에 숫자를 가로로 출력한 후 다시 바깥 for문으로 돌아가 수행한다.
단순히 앞뒤 인덱스 한번 비교하고 나오는게 아니라 쭉 훑고 나온다는점을 생각 못해서 헷갈렸다.
그래서 내가 회전 횟수를 저렇게 지정해주긴 했지만,
실제로 값을 돌리면 비교값이 별로 없는경우 행개수가 더 적은 경우도 있다.
'🔥 Vamos > Java' 카테고리의 다른 글
1005 | 배열 합계 구하기 오답정리 (다 했는데 2% 모자라다니 아깝다...!) (0) | 2022.10.05 |
---|---|
1004 | 자바의 정석 기초편 :: ch7-1~7-4 (0) | 2022.10.04 |
1002 | 구구단 가로로 출력하기 ver2. 만약에 내 습관대로 했다면? (0) | 2022.10.02 |
1002 | 구구단 가로로 출력하기 (0) | 2022.10.02 |
1002 | while문으로 별찍기 (0) | 2022.10.02 |