구매한 개수를 입력받아서,
입력한 개수 만큼의 로또를 만들고 발표된 로또와 몇 개의 숫자가 일치하는지 뽑아보는 코드를 짜보는 문제였다.
import java.util.*;
import java.util.ArrayList;
public class Main {
static List<int[]> list = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("로또 구매 수량을 입력하세요.(숫자 1-10) : ");
int buy = sc.nextInt();
char abc = 'A';
for (int i = 0; i < buy; i++) {
int[] lotto = new int[6];
Random random = new Random();
for (int j = 0; j < 6; j++) { //중복제거
lotto[j] = (random.nextInt(45) + 1);
for (int k = 0; k < j; k++) {
if (lotto[j] ==lotto[k]){
j--;
}
}
}
list.add(lotto);
}
for (int i = 0; i < list.size(); i++) {
int[] myLotto = list.get(i);
System.out.print(abc + " ");
abc++;
for (int j = 0; j < 6; j++) {
System.out.print(myLotto[j] + " ");
}
System.out.println();
}
System.out.println("[로또 발표]");
int[] realLotto = new int[6];
for (int i = 0; i < 6; i++) {
Random rd = new Random();
realLotto[i] = (rd.nextInt(45) + 1);
System.out.print(realLotto[i] + " ");
}
Arrays.sort(realLotto);
System.out.println();
System.out.println();
int count = 0;
System.out.println("[내 로또 결과]");
for (int i = 0; i < 6; i++) { //여기서 중첩 for문을 만들어서 두개의 배열을 비교하려고 했는데...안되넹
int[] myLotto = list.get(i);
for (int j = 0; j < 6; j++) {
if (myLotto[i] == realLotto[j]) {
count++;
}
}
for (int j = 0; j < 6; j++) {
System.out.print(myLotto[j] + " ");
}
System.out.println(" => " + count + "개 일치");
}
}
}
뭔가 실행은 됐다.
뭐 일단 오름차순으로 정렬되진 않았고, 아마 중복도 빼지 못하긴 했던것 같다... 엉망데스
- ArrayList< Integer > 로 바꿔보고
- 메소드 분리하기
- retainAll로 비교하기
를 해야하는데 메소드는 분리하자면 하겠는데.. 머리가 아푸다
list 왜케 많지
그리고 한참의 시간을 사용해서 리팩토링 해 본 결과물
package SSG4주차.로또_당첨_프로그램.윤여빈;
import java.util.*;
public class Main {
static ArrayList<Integer> lottoNum = new ArrayList<>();
//lottoNum 1-45까지의 숫자를 담은 리스트, 이걸 랜덤으로 돌려서 로또 번호를 뽑을 것이다
static ArrayList<Integer> lottoList = new ArrayList<>();
//lottoList 1장의 로또
static ArrayList<ArrayList<Integer>> lottoArray = new ArrayList<>();
//lottoArray lottoList여러개를 담은...이차원로또배열이다
static Scanner sc = new Scanner(System.in);
static Random random = new Random();
static int randomNum = 0;
//lottoList에, lottoNum에서 랜덤으로 뽑은 숫자를 하나씩 6번 넣어주기 위한 거쳐가는 변수 선언.
public static void assignLottoNum() {
lottoNum = new ArrayList<>();
for (int i = 1; i <= 45; i++) {
lottoNum.add(i);
}
}
public static void lottoDraw() {
lottoList = new ArrayList<>(); //이부분을 안했었는데(어차피 메인밖에서 스태틱으로 선언해서 안함), 하니까 중복제거되요
for (int i = 0; i < 6; i++) {
randomNum = random.nextInt(lottoNum.size());
lottoList.add(lottoNum.get(randomNum));
lottoNum.remove(randomNum);
}
Collections.sort(lottoList); // 컬렉션이나 리스트를 오름차순으로 정렬해주는 메소드
lottoArray.add(lottoList); //이중배열 lottoArray에 lottoList를 하나씩 넣어준다.
}
public static void printLotto() {
for (int i = 0; i < 6; i++) {
System.out.printf("%02d ", lottoList.get(i));
}
System.out.println();
}
public static void compareLotto(int buyLotto){
int count = 0;
for (int i = 0; i < buyLotto; i++){
lottoArray.get(i).retainAll(lottoArray.get(buyLotto));
System.out.println(lottoArray.get(i).size()+"개");
}
}
public static void main(String[] args) {
System.out.print("구매한 로또의 개수를 입력해주세요(숫자 1-10) : ");
int buyLotto = sc.nextInt();
char sequence = 'A';
for (int i = 0; i < buyLotto; i++) {
System.out.print(sequence++ + "\t");
assignLottoNum();
lottoDraw();
printLotto();
System.out.println();
}
System.out.println("\n[로또 발표]");
assignLottoNum();
lottoDraw();
printLotto();
compareLotto(buyLotto);
}
}
잘 모르겠는 부분이 많아서 여기저기 많이도 물어봤는데,
그들의 상냥한 설명을 내가 잘 받아들이질 못했다(빡대가리 인증...ㅡㅡ;;)
일단 전부다 메소드로 분리했다.
그리고 1-45숫자가 담긴 로또 번호를 뽑아낼 lottoNum 리스트와,
lottoNum에서 무작위로 뽑아낸 6개의 숫자를 담을 lottoList 리스트,
lottoList를 구매 개수 만큼 담아줄 lottoArray를 만들었다.
마지막에 로또 추첨은
lottoArray에 담긴 lottoList들을
앞의 lottoList들과 마지막 lottoList(당첨로또)를 retainAll을 이용해서 솎아내(?)주었다.
그렇게 솎아진 각 lottoList의 size+"개" 를 출력해주는것으로
몇개의 번호가 맞았는지 출력하였다.
원래 문제에서 요구하는바는 로또리스트를 다시한번 쭉 출력하고 해당 로또리스트에서 몇 개의 일치가 있는지,
하는 형식으로 출력하는거였는데
compareLotto()메소드를 만들 때 쯤엔 너무 오래 붙잡고 있었고, 너무 지쳐있었던 때라 그냥 몇 개 일치하는지만 출력해냈다.
어쨌건 해냈다(?)
반응형
'코딩테스트 > 미니과제' 카테고리의 다른 글
상품 관리 애플리케이션 (Spring MVC) (0) | 2024.03.16 |
---|---|
게시판 프로그램(데이터베이스 연동) (0) | 2024.02.05 |
가상 대선 시뮬레이션 (1) | 2024.01.07 |