본문 바로가기

JAVA/국비 공부

3월10일수업(로또04)

로또 게임(숙제)

사용자로부터 1부터 45까지 로또 숫자 6개를

입력받아서 정렬하여 출력하시오.

단, 사용자가 잘못된 숫자 혹은 중복된 숫자를 입력하면
올바른 숫자를 입력할때까지 다시 입력을 받도록 하세요.

 

package day0310;
import java.util.Scanner;

public class LottoGame04Answer {
    static final int SIZE = 6;
    static final int NUMBER_MIN = 1;
    static final int NUMBER_MAX = 45;

    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        // 사용자가 입력한 숫자를 보관할 배열
        int[] lottoNumbers = new int[SIZE];

        // 몇번 인덱스에 입력할 차례인지를 저장한 int idx;
        int idx = 0;

        // idx 가 lottoNumbers.length 보다 작을 동안
        // while() 을 이용해서, lottoNumbers[idx]에 사용자가 입력한 값을 하나씩 입력한다.
        while (idx < lottoNumbers.length) {
            System.out.printf("%d번 숫자\n", idx + 1);
            System.out.print("> ");
            int userNumber = scanner.nextInt();

            // 사용자가 입력한 값이 (NUMBER_MIN 이상 && NUMBER_MAX 이하)가 아닐 경우
            // 반복이 되게 while 문을 작성해준다.
            while (!(userNumber >= NUMBER_MIN && userNumber <= NUMBER_MAX)) {
                System.out.println("잘못 입력하셨습니다.");
                System.out.printf("%d번 숫자\n", idx + 1);
                System.out.print("> ");
                userNumber = scanner.nextInt();
            }

            // 사용자가 입력한 숫자가 중복인지 아닌지를 체크한다.

            // 사용자가 입력한 숫자가 중복이 아니면 true이고, 중복이면 false가 저장되는 numberChecker
            boolean numberChecker = true;

            // for 문을 사용해서, 만약 사용자가 입력한 숫자가 배열에 존재할 시에는
            // numberChecker를 false로 바꾸고 break 해준다.

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

                if (userNumber == lottoNumbers[i]) {

                    numberChecker = false;
                    break;

                }

            }

            // numberChecker에 저장된 값이
            // true이면, 현재 배열에 idx번 칸에 userNumber로 할당해주고 idx++해준다.
            // false이면, 이미 중복된 숫자입니다. 라는 메시지만 출력해 준다.

            if (numberChecker) {
                lottoNumbers[idx] = userNumber;
                idx++;
            } else {
                System.out.println("중복된 번호입니다.");
            }

        }

        // 정렬해주는 for 문

        // 우리가 lottoNumbers의 i 번째와 i + 1번째를 비교해야하므로
        // 이 for문의 반복 조건식은 i가 lottoNumbers의 크기보다 1 작을 동안으로 해야
        // 4번째와 5번째를 비교하고 for문이 종료되서 혹시라도 존재하지 않는 6번째 인덱스에
        // 접근이 안되게 된다.
        for (int i = 0; i < lottoNumbers.length - 1; i++) {

            // lottoNumbers의 i번째에 할당된 값이 i+1번째보다 크다는건
            // 큰 숫자가 앞에 나와있다는 의미 이므로, 2개의 순서를 바꿔준다.
            if (lottoNumbers[i] > lottoNumbers[i + 1]) {

                int temp = lottoNumbers[i];
                lottoNumbers[i] = lottoNumbers[i + 1];
                lottoNumbers[i + 1] = temp;

                // 위의 코드가 끝나고 나서
                // i를 -1로 할당하는 코드까지 실행하면
                // 그 다음에 실행되는 코드는 무조건 i++이기 때문에
                // 다시 배열의 제일 앞부터 정렬이 되어있는지 검사하고 정렬할 수가 있게 된다.
                i = -1;

            }

        }

        // 사용자가 입력한 숫자들을 출력해준다.
        for (int i = 0; i < lottoNumbers.length; i++) {
            System.out.printf("lottoNumbers[%d]: %2d\n", i, lottoNumbers[i]);
        }

        scanner.close();
    }

 

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

3월10일수업(별찍기01)  (0) 2021.03.11
3월10일 수업(로또05)  (0) 2021.03.11
3월9일(로또 02 해설)  (0) 2021.03.09
3월9일 수업(로또03)  (0) 2021.03.09
3월9일수업(로또2번)  (0) 2021.03.09