개발자/JAVA

[JAVA 12일차] 버블정렬/배열 오름,내림차순/Arrays.sort()/로또(lotto)/2차원배열

GoGo개발 2022. 8. 24. 19:12
버블정렬
정렬 대상 리스트(배열)의 항목을 수평방향으로 나열했다고 가정했을 때,
왼쪽 끝에서부터 시작해서 인접하는 두 항목의 값을 비교하여 올바른 순서(오름차순 또는 내림차순)로
되어있지 않으면 서로 위치를 교환하는 정렬방법이다.
이렇게 인접하는 항목의 값을 비교해서 위치를 교환하는 과정을 리스트(배열)의 마지막 항목까지 반복해서
제일 큰(또는 작은) 값이 끝에 오도록 한다. 각 회전(Pass)과정이 끝날때마다 정렬은 뒤에서부터 하나씩 완료된다.

 

<정렬하기 전 >

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    int[] numArr = {9,7,3,5,1};
    /*
        numArr[0] ==> 9 
        numArr[1] ==> 7
        numArr[2] ==> 3
        numArr[3] ==> 5
        numArr[4] ==> 1    
    */
        System.out.println("=== 정렬하기 전 ===");
        for(int i=0; i<numArr.length; i++) {
            String str = (i<numArr.length-1)?",":"\n";
            System.out.print(numArr[i]+str);
        }// end of for-----------------------
        /*
             === 정렬하기 전 ===
            9,7,3,5,1
 
*/
        int cnt = 0;
        for(int num : numArr) {
            String str = (++cnt < numArr.length)?",":"\n";
            System.out.print(num+str);
        }// end of for-----------------------
        /*
            9,7,3,5,1
        */
cs

 

<오름차순 정렬 후>

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// === 오름차순 정렬하기 전 === //
        // 9,7,3,5,1
//오름차순 정렬
        for(int i=0; i<numArr.length-1; i++) {
            // 비교할 대상을 추출할 개수 ==>  9  7  3  5 은 몇개? 4개
            // (int i=0; i<4; i++)
           
            for(int j=0; j<numArr.length-1-i; j++) {  // i=0;  ==> 조건식이 j<4; 되어야만 4번 비교해야 한다. 
                                                      // i=1;  ==> 조건식이 j<3; 되어야만 3번 비교해야 한다.
                                                      // i=2;  ==> 조건식이 j<2; 되어야만 2번 비교해야 한다. 
                                                      // i=3;  ==> 조건식이 j<1; 되어야만 1번 비교해야 한다. 
                if( numArr[j] > numArr[j+1]) {
                //  numArr[0] > numArr[1]     numArr[1] > numArr[2] 
                //      9     >     7              9    >     3
                    int temp = numArr[j];      // int temp = numArr[0];   int temp = 9;    int temp = numArr[1];   int temp = 9;    
                    numArr[j] = numArr[j+1];   // numArr[0] = numArr[1];  numArr[0] = 7;   numArr[1] = numArr[2];  numArr[1] = 3; 
                    numArr[j+1= temp;        // numArr[1] = temp;       numArr[1] = 9;   numArr[2] = temp;       numArr[2] = 9;
                }
                
            }// end of for------------------------
            
        }// end of for-----------------------------    
 
=== 오름차순 정렬한 후 ===
1,3,5,7,9
 
cs

 

<내림차순 정렬>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
System.out.println("\n=== 내림차순 정렬한 후 ===");
        numArr = new int[]{9,7,3,5,1};
        
        /*
             === 내림차순 정렬한 후 ===
            9,7,5,3,1
    
        */
        
        for(int i=0; i<numArr.length-1; i++) {
            
            for(int j=0; j<numArr.length-1-i; j++) {  
                
                if( numArr[j] < numArr[j+1]) {
                
                    int temp = numArr[j];          
                    numArr[j] = numArr[j+1];    
                    numArr[j+1= temp;        
                }
                
            }// end of for------------------------
            
        }// end of for-----------------------------
 
cs

 

sort()

 

sort() : 오름차순 정렬을 해준다. 클래스 메소드(Class method / Static method)로써 Arrays 클래스의 인스턴스 생성없이 바로 사용할 수 있다.

 

1
2
3
4
5
6
7
8
9
 
        numArr = new int[]{9,7,3,5,1};
        
        Arrays.sort(numArr); // 오름차순 정렬 
        
        for(int i=0; i<numArr.length; i++) {
            String str = (i<numArr.length-1)?",":"\n";
            System.out.print(numArr[i]+str);
        }// end of for-----------------------
cs

 

=>결과값 : 1,3,5,7,9

 

 

 

로또 (lotto)

 

1번 <index>
1
2
3
4
5
6
7
8
9
10
11
 
         int ball ==> 1,     2,   3,   4,   5,   6, .....  43,  44,  45
                  ==> 101102103104105106, ..... 143144145 
                  
         int[] ball_arr = new int[45];
         
                    ----------------------------------------------------
        index ==>   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ......| 42 | 43 | 44 | 
                    ----------------------------------------------------
                    
 
cs

 

2번 <index 와 값>

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int [] ball_arr = new int[45];
        
        // ball_arr 배열의 요소(방)마다 데이터값 입력하기
        for(int i=0; i<ball_arr.length; i++) {
            ball_arr[i] = i+1//101부터 시작이면 +1 대신 +101해주면 된다
        }
            
        
     
                    ----------------------------------------------------
           값  ==>   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ......| 43 | 44 | 45 |     
                    ----------------------------------------------------
           index ==>  0   1      2   3   4   5   6           42   43   44         
       
      
cs

 

3번

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
        
        int[ ] temp_arr = new int[5]; // 기존에 뽑았던 공의 방번호(배열의 index)를 기억시켜두는 용도
        
        for(int i=0; i<temp_arr.length; i++) {
            temp_arr[i] = -1//값 초기화
        }
        /*
              만약에 위와 같이 -1로 초기화를 해주지 않으면 모두 0으로 초기화가 된다.
              꺼내온 공의 방번호(index)가 0(실제는 1번공)이라면 
              이미 뽑은 공이라고 보기 때문에 이것은 말이 안된다.
            그래서 배열의 방번호(index)로 사용되지 않는 숫자인 -1로 모두 초기화한다.
        */
    /*
                              --------------------------
       temp_arr    값  ==>   | -1 | -1 | -1 | -1 | -1 |    초기화는 배열의 방번호로 안쓰이는 값으로 초기화해야 한다.
                            --------------------------
       temp_arr 값은 기본값인 0 으로 초기화 하면 안되고 배열의 방번호(index)로 사용되지 않는 숫자(지금은 -1)로 초기화 해주어야 한다.!!!!!                     
     */
        
        // 공의 방번호(배열의 index)를 꺼내는 작업을 6번 반복한다.
        // 0부터 44 까지인 index를 랜덤하게 6개를 뽑아오도록 한다.
        // 즉, 0~44 까지 난수를 발생시킨다.
        
        // 첫번째로   뽑은 index 가 3  ball_arr[3]  ==> 실제 공번호는 4 
    /*
                                 -------------------------
            temp_arr    값  ==>   | 3 | -1 | -1 | -1 | -1 |   
                                 -------------------------   
    */
        
        // 두번째로   뽑은 index 가 5  ball_arr[5]  ==> 실제 공번호는 5
/*
                                 ------------------------
            temp_arr    값  ==>   | 3 | 5 | -1 | -1 | -1 |        첫번째 뽑은것과 비교해서 5 있는지 없는지 보고 넣어주어야한다.
                                 ------------------------   
*/        
        
        // 세번째로   뽑은 index 가 0  ball_arr[0]  ==> 실제 공번호는 1
/*
                                 -----------------------
            temp_arr    값  ==>   | 3 | 5 | 0 | -1 | -1 |   
                                 -----------------------
*/        
        // 네번째로   뽑은 index 가 5  ball_arr[5] ==> 실제 공번호는 6 (중복!!)
        // 네번째로   뽑은 index 가 3  ball_arr[3] ==> 실제 공번호는 4 (중복!!)
        // 네번째로   뽑은 index 가 8  ball_arr[8] ==> 실제 공번호는 9 
        /*
                                  ----------------------
            temp_arr    값  ==>   | 3 | 5 | 0 | 8 | -1 |   
                                  ----------------------
*/            
        
        
        // 다섯번째로  뽑은 index 가 2  ball_arr[2]  ==> 실제 공번호는 3
        /*
                                  ----------------------
            temp_arr    값  ==>   | 3 | 5 | 0 | 8 | 2 |   
                                  ----------------------
*/        
        
        
        
        // 여섯번째로  뽑은 index 가 8 ball_arr[8] ==> 실제 공번호는 9 (중복!!)
        // 여섯번째로  뽑은 index 가 44 ball_arr[44] ==> 실제 공번호는 45 //마지막이니까 기록할 필요 없다.
        
cs

 

2차원 배열(참고용)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// === 1차원 배열 ===
            int[] subject_arr = new int[5]; // 1행 5열
            
            
        /*
                 ---------------------
         값      | 0 | 0 | 0 | 0 | 0 |
                 ---------------------
         index =>  0   1   2   3   4           
        */
            
            // === 2차원 배열 === 2차원배열 크게안중요한듯?
            int[][] point_arr = new int[4][3]; // 4행 3열
            
        /*
         값        -------------
                   | 0 | 0 | 0 |
                   -------------
                   | 0 | 0 | 0 |
                   -------------
                   | 0 | 0 | 0 |
                   -------------
                   | 0 | 0 | 0 |
                   -------------
                   
        index =>   -----------------------------
                   | [0][0] | [0][1] | [0][2] |
                   -----------------------------
                   | [1][0] | [1][1] | [1][2] |
                   -----------------------------
                   | [2][0] | [2][1] | [2][2] |
                   -----------------------------
                   | [3][0] | [3][1] | [3][2] |
                   -----------------------------               
         
                    
        
        */
                
            point_arr[0][0= 10
            point_arr[0][1= 20;
            point_arr[0][2= 30;
            
            point_arr[1][0= 40
            point_arr[1][1= 50;
            point_arr[1][2= 60;
            
            point_arr[2][0= 0
            point_arr[2][1= 0;
            point_arr[2][2= 0;
            
            point_arr[3][0= 100
            point_arr[3][1= 110;
            point_arr[3][2= 120;
            
            System.out.println("point_arr.length => " + point_arr.length);
            //point_arr.length => 4
            //이차원배열명.lenghth 은 행의 길이가 나온다.
            
            System.out.println("point_arr[0].length => " + point_arr[0].length);
            //point_arr.length[0] => 3
            //이차원배열명[행의인덱스].length 은 그행에 존재하는 열의 크기(길이)가 나온다.
            
            System.out.println("point_arr[1].length => " + point_arr[1].length);
            //point_arr.length[1] => 3
            //이차원배열명[행의인덱스].length 은 그행에 존재하는 열의 크기(길이)가 나온다.
             
            System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
            
            for(int i=0; i<point_arr.length; i++) { // 행
                
                for(int j=0; j<point_arr[i].length; j++) { //열
                    String str = (j<point_arr[i].length-1)?",":"\n";
                    System.out.printf("%3d%s", point_arr[i][j], str);
                    
                    
                    
                }//end of for-----------------
                
            }//end of for-----------------
cs

 

=> 출력결과   10, 20, 30
                       40, 50, 60
                        0,  0,  0
                       100,110,120