본문 바로가기

JAVA/국비 공부

3월9일(로또 02 해설)

System.out.println();
        System.out.println("중복 제거후");
        System.out.println();
        for (int i = 0; i < lottoNum.length; i++) {

            System.out.printf("lottoNum[%d]: [%2d]\n", i, lottoNum[i]);

        }

    }

}

※ 코드 리뷰

package day0309;
import java.util.Random;

public class LottoGame20Point {
    static final int size = 6;
    static final int NUMBER_MAX = 45;

    public static void main(String[] args) {

        Random random = new Random();
        System.out.println("로또게임 ver 0.2");

 

[ ] 배열이라는 데이터 타입을 말하는 것이다.
즉 아래의 선억식의 경우
 " int가 모여있는 int 배열 lottoNumbers를 선언하고, 그리고 해당 배열의 크기( = 길이)는 SIZE이다" 라는 의미가 된다.

º 요소 vs index
element는 배열 안의 각각의 구성원을 우리가 element 라고 한다.
일반적인 변수의 경우, 우리가 그 변수의이름을 알고 있기때문에
그 이름을 통해서 해당변수에 접근할 수있지만
배열의 경우 우리는 그 변수의 이름을 모른다.

int[] lottoNum = new int[size];

 하지만, 그 대신 배열의 각 칸에는 해당 엘리먼트에 대한 주소값이 저장되어 있다.
 따라서 우리가 해당 엘리먼트에 접근할 때에는 (=값을 할당하거나 호출할 때에는)
 이름 대신 배열의 해당 칸에 저장되어 있는 주소값을 이용해서 접근하게 되는 것이다.
 그때에 우리가 배열의 몇번째 칸에 접근할 것인지를 적어야하는데
 그 몇번째인지를 우리가 인덱스라고 하는 것이다.


아래의 for문은 

우리가 lottoNumbers 배열의 i번째 인덱스마다 random.nextInt(NUMBER-MAX)+1 한 값을 할당해주는 for문이다.

for (int i = 0; i < lottoNum.length; i++) {

아래 코드는 " lottoNumber의 i 번째 칸에 저장되어 있는 주소 값을 타고가서
                    그 공간에 random.nextInt(NUMBER_MAX)+1한 결과 값을 할당해라 라는 의미이다. "

           lottoNum[i] = random.nextInt(NUMBER_MAX) + 1;
       }

아래의 for문은

우리가 lottoNumbers 배열의 i번째 index에 저장되어 있는 값을 호출해서 화면에 출력하는 for문이다.

for (int i = 0; i < lottoNum.length; i++) {

여기서 lottoNumbers [ i ] 라고 적어주는데 이때는  lottoNumbers 배열의 i 번째 칸의 저장된 주소 값을 타고 들어가서
그 공간에 저장되어 있는 int 값을 불러오는 것이다.

           System.out.printf("lottoNumbers[%d]: [%2d]\n", i, lottoNum[i]);
       }

[ 중복제거 for문 ]

for (int i = 0; i < lottoNum.length; i++) {
            // int i = 0 i의 값이 lottoNumbers보다 작을때 넣어줘
            for (int j = 0; j < lottoNum.length; j++) {

                if (i != j && lottoNum[i] == lottoNum[j]) {
                    System.out.printf("%d 인덱스와 %d 인덱스가 중복이므로 %d에 새로운 할당\n", i, j, i);

                    lottoNum[i] = random.nextInt(NUMBER_MAX) + 1;
                    j = -1; // j는 -1로 초기화

                }
            }
        }

int idx = 0;
        while (idx < lottoNum.length) {
        int randomNumber = random.nextInt(NUMBER_MAX) + 1;
        boolean numberCheck = true;
        
        for (int i = 0; i < lottoNum.length; i++) {
                if (randomNumber == lottoNum[i]) {
                    numberCheck = false;
                    break;
                }
              }
        
        

랜덤 객체를 사용해서 1부터 45 사이의 랜덤 숫자를 하나 뽑아서 randomNumber 변수에 할당한다!

 

numberChecker의 현재값이 true 일 때에는
아래의 if문이 실행되는데 numberChecker가 true라는 것은 

randomNumber의 현재 값과 일치하는 값 lottoNubers에 존재하지 않는다라는 의미이고

 

따라서, randomNumber의 값이 중복되지 않는 값이라고 할 수 있다!

if (numberCheck) {
                // 아래코드는 lottoNumbers 배열 변수의 idx번 칸에
                // randomNumber의 현재값을 할당하겠다.
                lottoNum[idx] = randomNumber;
                idx++;
            }

        }

'JAVA > 국비 공부' 카테고리의 다른 글

3월10일 수업(로또05)  (0) 2021.03.11
3월10일수업(로또04)  (0) 2021.03.11
3월9일 수업(로또03)  (0) 2021.03.09
3월9일수업(로또2번)  (0) 2021.03.09
3월9일 수업(로또01)  (0) 2021.03.09