Skip to content

Conversation

@kwonjin2
Copy link

@kwonjin2 kwonjin2 commented Nov 3, 2025

기능 요구 사항

간단한 로또 발매기를 구현한다.

  • 로또 번호의 숫자 범위는 1~45까지이다.
  • 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
  • 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
  • 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
    • 1등: 6개 번호 일치 / 2,000,000,000원
    • 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
    • 3등: 5개 번호 일치 / 1,500,000원
    • 4등: 4개 번호 일치 / 50,000원
    • 5등: 3개 번호 일치 / 5,000원
  • 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
  • 로또 1장의 가격은 1,000원이다.
  • 당첨 번호와 보너스 번호를 입력받는다.
  • 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
  • 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 해당 지점부터 다시 입력을 받는다.

입출력 요구 사항

입력

  • 로또 구입 금액을 입력 받는다. 구입 금액은 1,000원 단위로 입력 받으며 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다.
14000

  • 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다.
1,2,3,4,5,6

  • 보너스 번호를 입력 받는다.
7

출력

  • 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다.
8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]
  • 당첨 내역을 출력한다.
3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개

  • 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)
총 수익률은 62.5%입니다.
  • 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.
[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.

실행 결과 예시

구입금액을 입력해 주세요.
8000

8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]

당첨 번호를 입력해 주세요.
1,2,3,4,5,6

보너스 번호를 입력해 주세요.
7

당첨 통계
---
3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개
총 수익률은 62.5%입니다.

추가 요구사항

  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
  • 3항 연산자를 쓰지 않는다.
  • 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
  • Jest를 이용하여 정리한 기능 목록이 정상적으로 작동하는지 테스트 코드로 확인한다.
  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
    • 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.
  • else를 지양한다.
  • 구현한 기능에 대한 단위 테스트를 작성한다.

구현할 기능 목록

  • 로또 구입 금액 입력받기

  • 로또 구입 갯수 출력하기

  • 로또 구입 내역 출력하기

    • 발행한 로또 번호는 오름차순으로 정렬
    • 줄바꿈을 통해 로또 1개씩 출력
  • 당첨 번호 입력 받기

    • 쉼표(,)를 기준으로 1~45 범위의 6개의 중복되지 않은 숫자를 입력받기
  • 보너스 번호 입력 받기

  • 당첨 통계 출력하기

    • 당첨 번호를 구분자 쉼표(,)를 기준으로 구분
    • 로또, 당첨 번호, 보너스 번호를 가지고 해당 로또가 맞힌 갯수와 보너스 번호를 맞힌 여부를 반환하는 메서드 (개별 로또 결과 계산)
    • 모든 로또에 대해 위의 결과를 계산, 맞힌 갯수가 3,4,5,5+보너스,6일 경우 각각 카운트 저장
    • 수익률 계산
    • 당첨내역 출력하기
    • 수익률 출력하기 (소수점 둘째자리에서 반올림)
  • 리팩토링

    • App에 있는 로또 관련 로직 로또 클래스에 옮기기
    • App에 있는 입출력 관련 로직 view로 분리하기
    • 상수 파일 만들어서 재사용하기(하드코딩값)
    • App을 controller 폴더 내로 옮기기
  • 에러 처리

    • 로또 클래스 관련
      • 로또 번호 6개가 아닌 경우(이미 구현되어 있음)
      • 로또 번호가 중복되는 경우
      • 로또 번호가 1~45 범위를 벗어나는 경우
    • 로또 구매 가격 입력 관련
      • 입력받은 금액이 숫자가 아닌 경우
      • 입력받은 금액이 1,000원 미만일 경우
      • 입력받은 금액이 1,000원 단위가 아닌 경우
    • 당첨 번호 관련
      • 당첨 번호가 숫자가 아닌 경우
      • 당첨 번호가 1~45 범위를 벗어나는 경우
      • 당첨 번호에 중복된 숫자가 있는 경우
      • 당첨 번호 개수가 6개가 아닌 경우
    • 보너스 번호 관련
      • 보너스 번호가 숫자가 아닌 경우
      • 보너스 번호를 입력받을 때 1~45 범위를 벗어나는 경우
      • 보너스 번호를 입력받을 때 당첨 번호와 중복되는 경우

최권진 added 30 commits October 29, 2025 16:27
- 구매금액에 맞는 로또를 발행하는 메서드 구현
- 로또를 오름차순으로 정렬하는 메서드 구현
- constructor에서 로또 번호 오름차순 정렬
- generateLottos: 여러 개 로또 생성
- getNumbers: 로또 번호 반환(private라 해당 메서드 필요)
- compareWithWinningNumbers: 당첨 번호와 로또 비교
- App에서 로또 생성, 번호 정렬, 비교 로직 제거
- Lotto.generateLottos 및 Lotto.compareWithWinningNumbers 활용
- 구매 금액이 숫자가 아닌 경우
- 구매 금액이 1,000원 미만인 경우
- 구매 금액이 1,000원 단위가 아닌 경우
- 번호가 숫자가 아닌 경우
- 번호가 1 ~ 45 범위가 아닌 경우
- 번호가 6개가 아닌 경우
- 번호가 중복된 경우
- 번호가 숫자가 아닌 경우
- 번호가 1 ~ 45 범위가 아닌 경우
- 번호가 당첨번호와 중복되는 경우
- 통계 관련 로직 분리
- App 클래스 내 불필요한 메서드 및 변수 제거
- LottoResult와 App간 연동 로직 수정
최권진 added 23 commits November 3, 2025 19:57
@kwonjin2 kwonjin2 force-pushed the kwonjin2 branch 2 times, most recently from 66b6ab0 to 79ff6f6 Compare November 3, 2025 14:46
Copy link

@manNomi manNomi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드가 원체 깔끔해서 제가 피드백을 많이 못드린것 같네요 ..
그러다 보니 조금 과한 부분에 대해서 피드백을 드리게 되어서 이것들은 고민하고 반영하셔도 좋을것 같습니다 3주차 고생하셨습니다!

- App에 있는 로또 관련 로직 로또 클래스에 옮기기
- App에 있는 입출력 관련 로직 view로 분리하기

- 에러 처리
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

애러처리 너무 상세한데요???

이거 복사해서 제 리드미에 몰래 넣고 싶은걸요

BONUS_NUMBER_RANGE: '[ERROR] 보너스 번호는 1 ~ 45 범위로 입력해 주세요.',
BONUS_NUMBER_DUPLICATE:
'[ERROR] 보너스 번호는 당첨 번호와 중복될 수 없습니다.',
};
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좀 과하긴 하지만 object.freez 사용과
[ERROR] -> ERROR_PREFIX :"[ERROR]" 또는
export default class CustomError extends Error{}
같은 방법모두 고려해보시면 좋을것 같아요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants