ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (국비교육) 7 - 랜덤 + 2차원 배열 + 로또뽑기 + N자 그리기 + 중복값 제거
    개발/국비교육 2023. 6. 9. 17:50

    ■ 지난 학습 복습

     

     

    * 주소값 출력 

    System.out.println(arr01); 

     

    * 번지에 저장된 값 출력

    System.out.println(arr01[0]); 

     

    ■ 사용자가 점수 입력하면 배열에 넣고 출력하기

     

     

    사용자가 입력한 점수를 입력하면 가져오게끔 하기 위해서는

    Scanner 를 통해 입력값을 설정할 수 있게 만들어준다.

     

    배열의 마지막까지 반복하기 위해서는 arr01.length 보다 작은 수로 설정한다.  

    sc.nextlnt() 를 통해 input 값을 입력받고, 입력값을 arr01[ i ] 로 설정해서 반복하여 저장한다.

     

    입력한 값의 배열 전체를 출력하기 위해서는 Arrays.toString() 을 이용한다.

    각 배열의 값을 구하기 위해서는 System.out.println( arr01[ i ] ); 으로 각 배열의 값을 출력할 수 있다.

     

    ※ import : 가져오기

     

    * forEach 향상문

     

     

    forEach 향상문은 요소와 집합으로 이루어져있는데, 코드는 아래와 같다.


    for (int i : arr01) {

           System.out.println(i);

    }

     

    (요소 : 집합) 모양으로 이루어져있으며 집합을 구성하는 요소를 하나씩 반환하게 된다.

     

    즉, arr01 집합에서 int i 의 요소를 출력하게 되면,

    for 반복문보다는 보다 간결하게 반복문을 실행할 수 있다. 

     

    ■ 랜덤으로 로또 뽑기 (1~45 숫자에서 6개 뽑기)

     

     

    자바의 랜덤(난수)로 로또 뽑기 진행을 위해서는 로또 번호 설정이 필요하다.

    로또는 1 부터 45 까지의 숫자로 이루어지고 6개의 숫자를 뽑기 때문에 이에 대한 설정이 필요하다. 

     

    먼저 6개의 숫자배열을 뽑기 때문에 배열을

     

    int[ ] lotto = new int[ 6 ]; 으로 선언해준다.

     

    이제 랜덤으로 뽑을 수 있게 설정해줘야 하는데 여기서 쓰이는 것이 Math.random() 이다.

    각 배열마다 랜덤값을 배정할 것으로 배열값을 i 로 설정하고, 각 배열마다 Math.random() 을 사용하여 랜덤값을 부여한다.

     

    lotto[ i ] = ((int) ((Math.random() * 45) + 1));

     

    여기서 랜덤 값에 * 45를 하면 0 ~ 44까지 나온다.

    우리는 1부터 나오게끔 설정하기 때문에 +1 을 해주면 1 ~ 45 까지의 값을 구할 수 있다.

     

    Math.random()은 double 형으로 int 로 캐스트 처리를 해주면 된다.

     

    이렇게 하고 출력하게 되면 랜덤으로 로또 번호를 1부터 45까지 출력할 수 있다.

     

    * 로또 중복값 없애기

     

     

    하지만 위와 같이 코딩을 하면 로또에 중복값이 발생하게 된다.

    따라서 중복값을 없애주는 작업이 필요하다.

     

    이를 for 문을 통해 조건을 걸어준다.

    lotto 두 번째 값이 첫 번째 값이랑 같게 되면 다시 랜덤으로 돌려주는 조건을 걸고, 이를 반복해야 한다. 

     

    따라서 lotto[ i ] == lotto[ j ] 로 설정하되, 

    랜덤값이 lotto[ 1 ] == lotto [ 0 ] 부터 돌게 설정하면 된다.

     

    for (int j = 0; j < i; j++) {
          if (lotto[ i ] == lotto[ j ]) {
          i--;
          break;
          }

    }

     

    즉 j 는 0부터 시작하되, i 가 1부터일때 비교하면 되므로 j < i 로 설정하고 증감시켜 준다.

    만약 둘의 값이 같다면 다시 랜덤값을 돌려줘야 함으로 i값은 감소시켜 주고 for 문을 빠져나간다. 

     

    * 1 ~ 25 까지 중 1개 뽑기

     

     

    1에서 25까지 랜덤으로 뽑는 방법도 위와 동일하게 배열을 i 로 설정하고,

    Math.random() * 25 를 통해 0 ~ 24 중 1부터 시작함을 +1을 통해 1 ~ 25까지 나올 수 있도록 설정하고 출력한다.

     

    ■ 2차원 배열 

     

     

    - 2차원 배열은 배열 속에 배열이 있다.

    - 2차원 배열은 값을 알기 위해서는 [ ][ ] 로 해야한다.

    - 2차원 배열의 설정은 

    자료형[ ][ ] 변수 = new 자료형[크기][크기] ;

     

    2차원 배열은 집과 방번호라고 생각하면 이해하기 쉽다.

     

    arr[ 0 ] [ 0 ] = 100; 

         집   방번호

     

    int[ ][ ] arr02 = new int[ 5 ][ 5 ]; 값에서 마지막 집과 방번호를 구한다면

    arr02[ 4 ][ 4 ] 가 마지막이다.

     

    index 2, index 마지막 방에 55를 저장하기

    arr02[ 2 ][ 4 ] = 55;

     

    * 2중 포문으로 모든 값 저장하기 (옆으로 찍어주기)

     

     

    arr02 2차원 배열을 반복문을 통해 출력하면

    배열의 각 집과 방번호에 해당하는 곳이 반복될 수 있도록 이중 for 문으로 설정해준다.

     

    5개를 찍고 다시 돌리기 위해서는 j 에 해당하는 for 문이 끝나면 엔터에 해당하는

    System.out.println(""); 를 통해 5개씩 출력 가능하다.

     

     

    2열 3행에 해당하는 arr03도 반복문을 통해 동일하게 출력 가능하다.

     

    arr03.length 는 arr03 의 집번호 2가 출력된다.

    arr03[ 0 ].length 는 arr03 의 0번째 집의 방이 몇 개 있는지를 물어보는 것이므로 3이 나온다. 

     

    마찬가지로 arr03[ 0 ] 을 temp 로 저장하고 temp.length 를 하면 3이 나온다.

     

    int[ ][ ] arr04 = new int[ 3 ][ 4 ]; 를 반복문을 통해 출력하고자 한다면,

     

    for (int i = 0; i < arr04.length; i++) {
          for (int j = 0; j < arr04[ i ].length; j++) {

                            System.out.print(arr04[ i ][ j ] + " ");

           }
          System.out.println("");

    }

     

    여기서 j 포문에 arr04[ i ].length 를 하는 이유는 j 는 방번호에 해당하므로

    arr04[ i ] 집번호에 있는 방번호의 길이를 찾아야 하기 때문이다.

     

    ■ 1 ~ 25 까지 5 x 5 정수타입 배열 출력하기

     

     

    먼저 5 x 5 배열을 선언해준다.

    int[ ][ ] arr01 = new int[ 5 ][ 5 ];

     

    배열의 집과 방번호의 반복이 필요하니 이중 for 문을 사용하여 i 와 j 로 설정해준다.

    여기서 우리는 1부터 시작해야 함으로 num = 1 이라는 변수를 선언해주고,

    이를 점차 증감시키도록 설정해준다.

     

    int num = 1;
    for (int i = 0; i < arr01.length; i++) {
               for (int j = 0; j < arr01[ i ].length; j++) {
                         arr01[ i ][ j ] = num++;

                         System.out.print(arr01[ i ][ j ] + " ");

               }
               System.out.println("");

    }

     

     

    우리는 위의 for 문을 for each 로도 구할 수 있다.

     

    집합 arr01 을 보니 그 안에 배열이 int 타입으로 보이는 배열 is 가 있고,

    배열집합 is 를 i 요소로 열 수 있다.

     

    이를 출력하면 위와 동일한 값을 얻을 수 있다. 

     

    int[ ] t = { 10, 12, 13, 14, 15}

     

    to.string 은 1차열 배열만 찍으며 객체를 문자로 표현하는 메소드이다.

     

     

    ■ 홀수를 입력 받았을 때 n으로 n 자 그리기 ( Multiarray04 참고)

     

    * 7 홀수를 받았을 때 n 그리기

     

     

    홀수 7을 입력받았을 때 배열을 만들면

    int[ ][ ] arr01 = new int[ 7 ][ 7 ]; 으로 나타낼 수 있다.

     

     [1,0,0,0,0,0,1] 00 06 
     [1,0,0,0,0,0,1] 10 16 
     [1,0,0,0,0,0,1] 20 26
     [1,0,0,0,0,0,1] 30 36 
     [1,0,0,0,0,0,1] 40 46 
     [1,0,0,0,0,0,1] 50 56
     [1,0,0,0,0,0,1] 60 76

     

    자리로 먼저 생각했을 때,  앞의 열이 반복되고 행은 0으로 고정

    앞의 열이 반복되고 행은 6으로 고정됐을 때 채워주면 된다.

     

    이중 포문을 사용하여 식으로 나타내면 다음과 같다.

     

    arr01[ i ][ 0 ] = 1;
    arr01[ j ][ 6 ] = 1;

     

    또한 대각선이 채워지는 방식을 보면 행과 열의 숫자가 같을 때 채워진다.

    즉, i = j 값이 같으면 배열에 1을 넣어주는 식으로 코드를 짠다.

     

    if ( i == j ) {
               arr01[ i ][ j ] = 1;
    }

     

    * 에러해결 (1이 한번씩 더 찍혀서 밀리는 경우) 

    출력문을 양옆 1로 채울때도 적고, if 조건문 다음에도 적게 되면 1이 한번씩 더 적히는 오류가 발생한다.

    따라서 최종적으로 if 까지 돌고 난 후 출력문이 나올 수 있도록 뒤에 설정해준다.

     

    * 혼자 코딩실습 ( 7 홀수를 받았을 때 n 그리기)

     

     

    해당 코딩을 if 조건으로 한 번에 설정하고 출력할 수도 있다. 

     

    * 홀수를 입력받고 n 그리기

     

     

    먼저 입력값을 받기 위해서 Scanner 를 불러온다.

    입력값을 num으로 저장하고, 저장받은 정수값으로 집번호와 방번호를 만든다.

     

    입력받은 값으로 이중 for 문을 통해 채워지도록 한다.

    조건으로 가장자리와 i 와 j 값이 같을 때 N 으로 채워져야 함으로

     

    열 i 와 행 j 의 값이 같거나 행값 j 가 0 이거나 j 가 방번호 길이보다 -1 인 값인 경우 N으로 채워준다.

    만약 그렇지 않은 경우는 공백으로 설정한다.

     

    출력의 경우 2가지로 출력 가능하다

     

    이중 for 문을 사용하거나 for each 를 통해 간단하게 나타낼 수도 있다.

     

    ■ 3 X 3 중복없이 1 ~ 9 넣기 (Test03)

     

     

    먼저 2차원 배열 [ 3 ][ 3 ] 을 만들어준다.

     

    배열에 들어갈 변수를 r1, r2 로 각각 선언해주고

    마지막 집번호와 방번호가 2까지 이므로 r1 과 r2 를 Math.random() * 3 을 통해 표현해준다.

     

    초기 정수 배열의 값은 0 임으로 만약 0일 경우에는 r1과 r2에 i 반복값을 넣어주고,

    그렇지 않을 경우에는 이미 숫자가 들어가 있는 경우이기 때문에 다른 배열에 숫자가 들어갈 수 있도록 설정해준다.

     

    설정이 완료 되었다면 2중문 혹은 for each 구문을 통해 출력할 수 있다. 

     

    java]삽질코드 3x3배열에 1~9숫자 무작.. : 네이버블로그 (naver.com)

     

    java]삽질코드 3x3배열에 1~9숫자 무작위로 입력하기

    java]삽질코드 3x3배열에 1~9숫자 무작위로 입력하기

    blog.naver.com

     

Designed by Tistory.