[JAVA] 26. 최종 테스트 - 로또

문정준's avatar
Feb 11, 2025
[JAVA] 26. 최종 테스트 - 로또
 

ArrayList - Collection

  • 배열 vs 컬렉션
  • 배열 : 수정 및 검색 가능, 인덱스 추가 및 삭제는 불가
  • 컬렉션 : 데이터가 띄엄띄엄 들어감, 다음 번지의 주소 저장
    • 데이터 추가, 삭제, 수정, 검색 가능
 
notion image
 
notion image
 
package algo; import java.util.ArrayList; public class Lotto01 { public static void main(String[] args) { // 배열 vs 컬렉션 // int -> Integer // double -> Double // String -> String ArrayList<Integer> arr = new ArrayList<Integer>(); arr.add(1); arr.add(3); arr.add(5); System.out.println(arr.get(0)); System.out.println(arr.get(1)); System.out.println(arr.get(2)); } }
 

로또 문제

  • 1 ~ 45의 수 중 중복되지 않는 무작위의 6개의 수를 출력하시오.
 

문제 분석

  • 무작위의 수 : 난수 활용 = Math.random()
  • 숫자가 나오는 대로 배열에 추가 : 배열 or 컬렉션 활용
  • 중복 방지 : 같은 수일 경우 저장 X
 

코드 작성 - Sampling, Moduling

package algo; import java.util.ArrayList; import java.util.Random; public class Lotto01 { public static void main(String[] args) { // 1. Sampling : 1 ~ 45까지의 중복되지 않는 6개의 수를 추출하시오. // 2. Hard Coding : 특징 찾기 // 1. 난수 활용 필요 : Random 패키지 사용 // 2. 6개의 수를 뽑고, 저장이 필요 : 배열 사용 // 3. 중복되지 않기 위해서 이전의 인덱스와 비교가 필요 // 중복 시? 다시 번호 추첨 // 4. for의 횟수는 정해져 있는데 어떻게 계속 반복? : i를 감소 // 5. 중복 확인 시 : 값 저장에 사용하는 for 변수 i = j + 1 // 6. 첫 번째 값은 무조건 넣고, 두 번째부터는 현재 인덱스 전의 값 까지만 비교하려면? // 배열 vs 컬렉션 // int -> Integer // double -> Double // String -> String // ArrayList<Integer> arr = new ArrayList<Integer>(); // 이 예제에서는 배열을 사용하기 때문에 컬렉션은 주석 처리함. int[] arr2 = new int[6]; Random rand = new Random(); // 3-1. 숫자 정렬을 위한 버블정렬 함수 클래스 선언 Uc f = new Uc(); // 3. Moduling for (int i = 0; i < 6; i++) { // 3-2. 난수를 뽑기 위한 Random() 클래스 int number = rand.nextInt(45) + 1; // 1 ~ 45의 수 // 3-3. 예외 1 : 첫 항은 무조건 배열에 삽입 if (i == 0) arr2[i] = number; else { for (int j = 0; j < i; j++) { // 3-4. 중복이 아닐 경우 배열에 저장 if (arr2[j] != number) arr2[i] = number; // 3-5. 예외 2 : 중복일 경우 i를 1 감소시킨 후 다시 난수 추출 // j = i - 1을 대입함으로써 중복 체크용 반복문 바로 종료 else { i--; j = i - 1; } } } } // 결과 출력 System.out.print("당첨 번호 : "); // 3-6. 결과 버블 정렬 (오름차순) int[] result = f.bubble(arr2); for (int i = 0; i < result.length; i++) { System.out.print(result[i] + " "); } } }
Hard Coding과 Moduling을 통해 알아낸 특징
  1. 난수 활용 필요 : Random 패키지 사용 (Boundary 지정 가능)
  1. 6개의 수를 뽑고, 저장이 필요 : 배열 사용 (컬렉션을 사용해도 됨)
  1. 중복되지 않기 위해서 이전의 인덱스와 비교가 필요
      • 중복 시? 다시 번호 추첨
        • 중복일 경우 i를 1 감소시킨 후 다시 난수 추출
        • j = i - 1을 대입함으로써 중복 체크용 반복문 바로 종료
  1. for의 횟수는 정해져 있는데 어떻게 계속 반복? : i를 감소
  1. 중복 확인 시 : 값 저장에 사용하는 for 변수 i = j + 1
  1. 첫 번째 값은 무조건 넣고, 두 번째부터는 현재 인덱스 전의 값 까지만 비교하려면?
      • j < i의 조건은 동일하되, i를 무조건 한 번 실행시키면 됨.
 

결과

  • 1회차
notion image
  • 2회차
notion image
  • 3회차
notion image
Share article

sxias