[우테코 프리코스] FE 김머핀의 3주차 회고록 - 로또

Murpin·2022년 11월 21일
0

우테코프리코스

목록 보기
3/5
post-thumbnail

서론

최근 동아리에서 2학기 MT 및 컨퍼런스의 진행을 하게 되면서 굉장히 바쁜 나날을 보냈다. 진행자체가 주말이어서 평일엔 컨퍼런스, MT 준비를 하고 주말에 진행하느라 우테코 과제에 쏟는 시간이 적었다.
하지만! 행사 끝나고 바로 작업에 들어가서 어찌저찌 리팩토링도 하고 다했지만, 가장 막혔던 부분은 테스트 코드이다.
테스트를 작성해야한다라… 일단은 많은 부분으로 테스트를 해야할 부분은 생각하고 예외사항을 추가했다.
이번 과제를 수행했던 나의 과거와 코드를 찾아보겠다.

문제에 대한 고찰

일단 처음 문제를 보았을 때 로또에 대해서 많은 에러처리가 필요해 보였다.
1. 중복되지 않은 6자리의 수를 입력해야하며, 보너스 숫자라는 또 다른 입력이 존재하여 굉장히 테스트를 많이 해보기 좋은 문제였다.
2. 로또 생성은 랜덤이지만 그에 대한 당첨번호는 사용자의 입력임을 알고 그에 대한 에러처리를 하고 테스트코드를 통해 이를 더 많이 해결해보자

1장에 1000원, 로또를 구매하여 자동으로 뽑기를 진행한다.
그리고 자동으로 뽑힌 로또에 대한 결과를 보여준다.
그리고 당첨번호는 사용자가 정한다.
여기서 당첨번호 6개와 보너스 번호 1개가 존재한다.
그리고 당첨을 확인하고 당첨된 현황을 보여주고
복권구매비용과 복권당첨금액에 대한 수익률을 보여준다.

1. 로또

일단은 구매하는 로또는 하나당 1000원이다.
그렇다면 1500원을 내면 당연하게도 한 장만 구매 가능하다.
하지만 이렇게 1000원으로 나누어 떨어지지 않는 경우를 예외사항, 즉 에러로 분류한다.
그렇다면 어떻게 해야하나. 당연한게도 1000원으로 나누어 떨어지지 않음을 확인해서 이를 해결 가능할 것이다.

이렇게 다행하게 구매를 했다면 이제 자동으로 뽑힌 복권을 보여줘야한다.
다행히도 이 부분에 대해서는 우테코에서 지원해준 라이브러리에 아주 좋은 메서드가 존재했다.

val numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6)

위의 코드를 통해서 1~45의 숫자 중 서로 다른 6개의 수를 출력하는 기능이다.
그렇다면 이렇게 여러개의 로또를 생성하는 경우를 생각해보면,

만약 로또가 똑같은 것이 나온다면?
로또 1등이 여러명을 나온 것을 생각한다면, 굳이 생각하지 않아도 된다.

로또 생성에 대한 유효성을 정리하면
1. 로또를 구매하는 금액은 반드시 1000원 단위로 구매하여야한다.
2. 로또의 구매는 제공되는 메서드로 생성하니 크게 상관하지 않아도 된다.
이 두 가지가 될 것이다.

2 . 사용자의 당첨번호 입력

이렇게 로또가 생성된 후 사용자는 당첨번호 6개와 보너스 번호 1개를 입력해야한다.
이떄 입력하는 당첨번호의 양식은 ,를 활용하여 입력된다.
여기서 예외 처리는 ,를 활용하지 않는 입력, 중복되는 당첨번호, 1~45를 벗어나는 경우가 예외가 될 것이다.

그리고 보너스 번호의 경우에는
당첨번호와 중복되는 경우와, 1~45를 벗어나는 경우, 숫자가 아닌 경우 일 것이다.

당첨번호와 보너스 입력의 예외를 정리하면
1. 입력이 반드시 숫자여야하며, 당첨 번호는 ,를 통해 6개가 입력되어야한다.
2. 1~45의 범위의 숫자여야 한다.
3. 당첨번호 6개와 보너스 번호 1개는 서로 중복이 있어서는 안된다.
이 세가지가 될 것이다.

3. 당첨 내역 확인하기

사용자가 정상적으로 입력한 당첨번호와 보너스 번호의 당첨을 선정해야한다.
당첨 조건은 아래와 같다.

3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개

먼저 3개 이상부터 당첨이며, 이때 중요한 것은 보너스 번호의 첨부이다.
만약 로또가 당첨번호 2개와 보너스 번호 1개와 일치하는 경우에는 3개로 인정하지 않는다.
이는 로또의 규칙이니 이를 생각한다.
그렇다면 보너스 번호는 무엇이냐?
보너스 번호의 경우에는 당첨번호 5개가 일치한 경우 보너스 번호를 추가로 검사하여 보너스 번호가 있을 시 5개 보다 더 높은 금액을 받을 수 있다.
보너스 번호의 사용처는 5개만 있을 때 비교하여도 좋다.

여기서는 예외 사항보다는 로또의 규칙이다.
1. 보너스 번호는 5개를 일치시킨 로또만 비교한다.

4. 수익률 계산

위와 같이 당첨된 로또를 계산했다면, 총 당첨금액을 출력하는 것이 아닌 수익률을 계산해야한다.
수익률 계산의 경우에는
(총 당첨 금액) / (로또 구매 금액)으로 계산된다.
이때 만약 수익률이 소수점으로 내려갈 경우를 어떻게 처리할 것인지 혹은 그 이상으로 올라간다면 어떻게 표현할지를 생각하는게 좋을 것 같다.

  1. 수익률에 대한 퍼센트 숫자 표시에 대한 처리

이번 문제를 풀며…

너무 늦게 시작해서인지 급한 마음에 코드를 작성한게 너무 보였다.
예외처리에 대해서 테스트코드를 작성하였지만, 원래 있던 부분을 조금씩만 수정해서 간단하게 작성하였다.
하지만 위에서의 예외사항을 분석하여 나만의 해결 로직을 생성했던 것이 많은 도움이 되었던 것 같다.
동아리 활동도, 학업도, 개인 개발에, TIL!
솔직히 동아리 행사 준비랑 행사진행이 걸려서 깊게 파지 못한 것은 너무 아쉬웠지만 4주차를 빠르게 마무리하고 리팩토링도 현재 마쳤다. 4주차는 게으르게 하지 말자!

profile
모든 것에 배움을 얻고자합니다

0개의 댓글