STUDY/web

자바 LottoGame 코드 리뷰

이앤지 2021. 9. 13. 23:58

지난주까지 자바 기초 중에서도 for문 별찍기까지 하면서

슬슬 박차를 가했고

오늘은 배열, 리스트를 하면서

예제로 LottoGame을 주제로 일확천금의 꿈을 키웠다.

 

마지막 주제가 나름대로 가장 고난이었던 것 같아서

나름대로 코드리뷰를 해보려고 한다.

물론 코드리뷰가 다가 아니고! 더 중요한 것은

담에 같은 주제로 또 도전할 때 지금보다는 나은 코드를 만들자는거~!^^

 

/*로또퀴즈!

 * 제한시간 20분
 * 컴퓨터의 숫자 6개를 랜덤으로 뽑고,
 * 사용자의 숫자 6개는 수동 혹은 자동으로 할지 입력받아서
 * 사용자의 선택에 맞추어 6개의 숫자를 뽑아서
 * 컴퓨터 숫자 6개와 사용자 숫자 6개 중
 * 일치하는 숫자가 총 몇개인지 구하여 출력하는 프로그램.
 */

 

힌트는

나만 알겠지롱~~ㅋ. 혹시 같이 수업을 들었던 분이 우연히 보게되면 알까~ㅎㅎ

 

 

암튼

논리 단계는 아래와 같다.

1. 기본적으로

사용자의 수를 입력받을 스캐너와 로또 난수를 생성해줄 랜덤을 임포트하고,

로또 난수를 넣을 리스트의 길이와 불변의 최솟값, 최댓값은 상수로 고정

사용자 로또 리스트와 컴퓨터의 로또 리스트를 구별지어서 배열을 만든다.

 

2. 구체적으로

  1) 컴퓨터의 로또 리스트가 채워지는 코드

  2) 사용자의 로또 리스트가 채워지되,

     로또 번호가 자동생성인지/ 수동생성인지 구별해서 선택에 따라 각각 채울 수 있도록.

     (물론 복권방가면 나는 무조건 자동으로 한다. 어차피 로또는 행운이니깐,,,ㅋㅋ)

     수동일때는 사용자가 엉뚱한 수를 입력할 때를 방지하는 코드를 넣기

     각각 중복인 숫자는 없어야 한다.

  3) 컴퓨터의 로또 리스트와 사용자의 로또 리스트의 숫자를 비교하는 코드를 넣고

      끝으로 출력 해준다.

 

 

이렇게 글로만 적어놓는 까닭은 일~단~ 여기까지가 기회고~~

다시 한번 도전해보고 오자..!

어려워도 직접 해봐야 논리적인 코드를 짜는 방법을 익힐 수 있다.

아니면 진짜 나중에 뭔 문제이해도 못하는 수준으로 멍만 때리는 수가 있음..

당장 프로그래머스 자바 테스트만 봐도 알 수 있다.

나한테 하는 얘기다.ㅋㅋㅎㅎ

 

 

 


 

코드리뷰)

 

논리 단계에 따라 물 흐르듯 코드도 흐른다.

1. 기본적으로

사용자의 수를 입력받을 스캐너와 로또 난수를 생성해줄 랜덤을 임포트하고,

import java.util.Scanner;
import java.util.Random;


public class LottoGame{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

로또 난수를 넣을 리스트의 길이와 불변의 최솟값, 최댓값은 상수로 고정

        final int NUMBER_MIN = 1;
        final int NUMBER_MAX = 45;
        final int LENGTH = 6;

사용자 로또 리스트와 컴퓨터의 로또 리스트를 구별지어서 배열을 만든다.

        // 사용자의 숫자 배열
        int[] userNumbers = new int[LENGTH];
        // 컴퓨터의 숫자 배열
        int[] computerNumbers = new int[LENGTH];

 

 

2.

  1) 컴퓨터의 로또 리스트가 채워지는 코드

 for (int i = 0; i < computerNumbers.length; i++) {
            int num = random.nextInt(NUMBER_MAX) + 1;

		// 만약 문제가 없으면 true;
            // 문제가 있으면 false를 저장할
            // boolean 변수를 만든다. 
            boolean saveSwitch = true;
            
            
            //사용자가 입력한 값이 1~45가 아닐 경우
            //saveSwitch에 false를 저장하고 그 외는 true를 저장
            saveSwitch = num >= NUMBER_MIN && num <= NUMBER_MAX;
            
            //array 전체를 확인하여
            //만약 i번 칸의 저장된 값이
            //num과 같으면, inputSwitch를 false로 저장한다.
            for (int j = 0; j < computerNumbers.length; j++) {
                if (num == computerNumbers[j]) {
                    saveSwitch = false;
                }
            }

            if (saveSwitch) {
                //아무런 문제가 없었으므로
                //i번째 인덱스에 num을 저장한다.
                computerNumbers[i] = num;

            } else {
                i++;
            }
        }
        
        //컴퓨터 로또 배열을 정렬    
        for (int i = 0; i < computerNumbers.length - 1; i++) {
            if (computerNumbers[i] > computerNumbers[i + 1]) {
                int temp = computerNumbers[i];
                computerNumbers[i] = computerNumbers[i + 1];
                computerNumbers[i + 1] = temp;

			//i++이 무조건 실행되기 때문에
                //증가된 i값을 하나 줄여서 i의 값을 명확하게 해준다.
                i = -1;
            }
        }

 

나는 boolean을 전혀 생각하지 않았었는데 선생님께서는 boolean으로 별 문제가 없을시 true로, 문제발생시 false로 저장할 변수를 만드는 방법을 주셨다. 기발해서 그대로 넣었다.

 

2) 사용자의 로또 리스트가 채워지되,

     로또 번호가 자동생성인지/ 수동생성인지 구별해서 선택에 따라 각각 채울 수 있도록.

     (물론 복권방가면 나는 무조건 자동으로 한다. 어차피 로또는 행운이니깐,,,ㅋㅋ)

 System.out.println("1. 자동 2. 수동");
        System.out.println("> ");
        int userChoice = scanner.nextInt();

 수동일때는 사용자가 입력을 받을 수 있도록 해준다.

 for (int i = 0; i < userNumbers.length; i++) {
            int num = random.nextInt(NUMBER_MAX) + 1;
            if (userChoice == 2) {
                System.out.printf("%d번째 숫자 \n", i + 1);
                System.out.println("1~45사이의 숫자를 입력해주세요.");
                System.out.println("> ");
                num = scanner.nextInt();
            }

            boolean saveSwitch = num >= NUMBER_MIN && num <= NUMBER_MAX;

            for (int j = 0; j < userNumbers.length; j++) {
                if (num == userNumbers[j]) {
                    saveSwitch = false;
                }
            }

방식은 컴퓨터의 로또 리스트와 비슷하다.

단, 사용자의 입력이 잘못된 방식일 경우, 에러메시지를 준다.

            if (saveSwitch) {
                userNumbers[i] = num;
            } else {
                if (userChoice == 2) {
                    System.out.println("잘못 입력하셨습니다.");
                }

                i--;
            }

        }

역시 같은 정렬 방식

        for (int i = 0; i < userNumbers.length - 1; i++) {
            if (userNumbers[i] > userNumbers[i + 1]) {
                int temp = userNumbers[i];
                userNumbers[i] = userNumbers[i + 1];
                userNumbers[i + 1] = temp;
                i = -1;

            }
        }

 

  3) 컴퓨터의 로또 리스트와 사용자의 로또 리스트의 숫자를 비교하는 코드를 넣고 출력,

        System.out.println("사용자 숫자");
        for(int i = 0; i<userNumbers.length; i++) {
            System.out.printf("[%2d] ", userNumbers[i]);
        }
        
        System.out.println("\n");
        System.out.println("-------------------");
        
        System.out.println("컴퓨터 숫자");
        for(int i = 0; i<computerNumbers.length; i++) {
            System.out.printf("[%2d] ", computerNumbers[i]);
        }
        System.out.println("\n");

      끝으로 두 배열의 같은 숫자 갯수를 비교하는 코드를 넣고 마무리 출력 해준다.

        //두 배열의 같은 숫자의 갯수를 저장할 int cnt
        int cnt = 0;
        for(int i = 0; i<userNumbers.length; i++) {
            for(int j = 0; j<computerNumbers.length; j++) {
                if(userNumbers[i] == computerNumbers[j]) {
                    cnt++;
                }
            }
        }
        
        System.out.println("총 일치하는 숫자의 갯수: "+ cnt);
        
        
        scanner.close();
        
    }

}

 

 

 

^ㅡㅡㅡㅡ^v

내일도 힘내자!