본문 바로가기

TIL/Java

Java 로또만들기 - (오류발견 : 보너스번호관련)

반응형

처음에는 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