처음에는 HashSet <Integer>로 로또 넘버를 추첨할 Set형식을 만드는데,
여기서 HashSet을 사용한 이유는 : 중복된 번호를 뽑지 못하기 위해 사용하였다
당첨번호를 뽑을때는
while문을 사용하여 앞서 만들었던 HashSet 형 로또 넘버의 사이즈가 7이 될 때까지 랜덤으로 번호를 뽑는다
(랜덤번호는 1~45까지 맞춤)
여기서 오류!!
HashSet으로 번호를 뽑을 때, 중복이 안된다는 장점이 있지만
반면에 뽑은 숫자가 Set으로 들어갈 때, 랜덤으로 인덱스가 형성된다는 점
즉, 보너스 번호가 어딨는지 모른다는 점이다.
문제가 발생할지 몰랐을 때는, 그저 HashSet에 마지막 인덱스가 보너스 번호라고 인지했었다
하지만 HashSet에는 인덱스를 확인할 수 없어서
ArrayList를 만들고 로또번호를 그곳에 옮겨주었다
그리고 로또 당첨번호를 출력해주고,
사용자가 뽑는 것은 계속 뽑아야 하기 때문에 맨 아래에 method로 만들어주었다 (selectNum())
엄청난 행운으로 한 번에 뽑는 것을 가정하여, 맨 처음에는 로또 당첨번호와 뽑은 번호 한 번씩을 출력하고,
그 밑에 while문을 통해 값이 같아질 때까지 반복을 돌릴 예정이다.
하지만, 그전에 1등과 2등을 구별해야 하기 때문에
보너스볼을 따로 ArrayList로 만들어주었고, 그 배열에 로또 당첨번호의 마지막 인덱스를 넣어주었다
while 문 안에서는 첫 번째로 계속 뽑는 번호를 리셋해주어야 하기 때문에 메서드를 가져왔고,
다시 뽑은 번호 (relottoSelect)와 당첨번호를 retainAll을 통해 교집합을 뽑아주었다
그러면, relottoSelect에는 당첨번호와 같은 번호만 배열에 남게 된다.
그렇다면, 가정문을 사용하여
if(relottoSelect.size() == 6)
다시 뽑은 로또의 사이즈가 만약 6이라면 로또 당첨번호 7개 중에서 6개가 동일할 때를 의미한다
그러면 1등과 2등 둘 다 나오게 된다.
1등은 당첨번호 7개 중에 보너스 번호를 제외한 나머지 6개이고,
2등은 당첨번호 7개중에 보너스 번호를 포함한 6개이기 때문이다.
그렇기에 안쪽에 가정문을 하나 더 넣어준다
또 안에 반복문을 넣어서 재추첨한 번호의 처음부터 끝까지 돌 때, 보너스 번호가 있는지 확인한다
있으면 2등 없으면 1등 출력
그리고 뽑을 때마다 count를 세는데
맨 처음 비교할 때 한번 뽑기 때문에 count = 1로 넣고
다시 뽑을 때마다 카운트의 횟수를 늘려준다 (count++)
그리고 마지막 출력할 때 count를 1 더해준다 (당첨될 때 count는 안세고 있기 때문에)
그리고 복권 같은 경우에 한번 뽑을 때마다 천 원씩 이기 때문에
돈은 카운트에 1000을 곱하면 되고
가독성을 높이기 위해, 배열을 만들어서 나누고 나눈 나머지 값들로 제차 나누는 형식으로
억 / 천 / 백 / 십 / 만
에 맞게 표기하였다
평균적으로 10억대가 나오는데, 가끔 잘 나오면 이렇게 2억대가 나오기도 했다
결론 : 이 코드는 보너스 볼에서 문제가 있고, 로또는 사면 안 되겠다.
'TIL > Java' 카테고리의 다른 글
Java Yacht dice game 구현하기 (0) | 2021.08.03 |
---|---|
Java 로또만들기 정답버전 (0) | 2021.08.03 |
Basic Algorithm 14th (0) | 2021.08.03 |
Basic Algorithm 13th (0) | 2021.08.03 |
Basic Algorithm 12th (0) | 2021.08.03 |