{"id":15581005,"url":"https://github.com/noxknow/java-lotto-6-mirror","last_synced_at":"2025-03-29T08:22:28.262Z","repository":{"id":212944389,"uuid":"732670338","full_name":"noxknow/java-lotto-6-mirror","owner":"noxknow","description":"우아한테크코스 6기 로또 미션 미러 저장소","archived":false,"fork":false,"pushed_at":"2023-12-17T13:14:55.000Z","size":125,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-03T22:38:48.958Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noxknow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2023-12-17T13:13:00.000Z","updated_at":"2023-12-17T13:14:44.000Z","dependencies_parsed_at":"2023-12-17T14:27:21.245Z","dependency_job_id":"46829e78-46cd-422b-bc31-ee7d638b7e66","html_url":"https://github.com/noxknow/java-lotto-6-mirror","commit_stats":null,"previous_names":["noxknow/java-lotto-6-mirror"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noxknow%2Fjava-lotto-6-mirror","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noxknow%2Fjava-lotto-6-mirror/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noxknow%2Fjava-lotto-6-mirror/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noxknow%2Fjava-lotto-6-mirror/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noxknow","download_url":"https://codeload.github.com/noxknow/java-lotto-6-mirror/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246157611,"owners_count":20732646,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-02T19:41:00.623Z","updated_at":"2025-03-29T08:22:28.243Z","avatar_url":"https://github.com/noxknow.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 미션 - 로또\n\n## 🔍 진행 방식\n\n- 미션은 **기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항** 세 가지로 구성되어 있다.\n- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.\n- 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다.\n\n## 📮 미션 제출 방법\n\n- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다.\n    - GitHub을 활용한 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서를 참고해\n      제출한다.\n- GitHub에 미션을 제출한 후 [우아한테크코스 지원](https://apply.techcourse.co.kr) 사이트에 접속하여 프리코스 과제를 제출한다.\n    - 자세한 방법은 [제출 가이드](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 참고\n    - **Pull Request만 보내고 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.**\n\n## 🚨 과제 제출 전 체크 리스트 - 0점 방지\n\n- 기능 구현을 모두 정상적으로 했더라도 **요구 사항에 명시된 출력값 형식을 지키지 않을 경우 0점으로 처리**한다.\n- 기능 구현을 완료한 뒤 아래 가이드에 따라 테스트를 실행했을 때 모든 테스트가 성공하는지 확인한다.\n- **테스트가 실패할 경우 0점으로 처리**되므로, 반드시 확인 후 제출한다.\n\n### 테스트 실행 가이드\n\n- 터미널에서 `java -version`을 실행하여 Java 버전이 17인지 확인한다.\n  Eclipse 또는 IntelliJ IDEA와 같은 IDE에서 Java 17로 실행되는지 확인한다.\n- 터미널에서 Mac 또는 Linux 사용자의 경우 `./gradlew clean test` 명령을 실행하고,\n  Windows 사용자의 경우 `gradlew.bat clean test` 또는 `./gradlew.bat clean test` 명령을 실행할 때 모든 테스트가 아래와 같이 통과하는지 확인한다.\n\n```\nBUILD SUCCESSFUL in 0s\n```\n\n---\n\n## 🚀 기능 요구 사항\n\n로또 게임 기능을 구현해야 한다. 로또 게임은 아래와 같은 규칙으로 진행된다.\n\n```\n- 로또 번호의 숫자 범위는 1~45까지이다.\n- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.\n- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.\n- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.\n    - 1등: 6개 번호 일치 / 2,000,000,000원\n    - 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원\n    - 3등: 5개 번호 일치 / 1,500,000원\n    - 4등: 4개 번호 일치 / 50,000원\n    - 5등: 3개 번호 일치 / 5,000원\n```\n\n- 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.\n- 로또 1장의 가격은 1,000원이다.\n- 당첨 번호와 보너스 번호를 입력받는다.\n- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.\n- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, \"[ERROR]\"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.\n    - `Exception`이 아닌 `IllegalArgumentException`, `IllegalStateException` 등과 같은 명확한 유형을 처리한다.\n\n### 입출력 요구 사항\n\n#### 입력\n\n- 로또 구입 금액을 입력 받는다. 구입 금액은 1,000원 단위로 입력 받으며 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다.\n\n```\n14000\n```\n\n- 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다.\n\n```\n1,2,3,4,5,6\n```\n\n- 보너스 번호를 입력 받는다.\n\n```\n7\n```\n\n#### 출력\n\n- 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다.\n\n```\n8개를 구매했습니다.\n[8, 21, 23, 41, 42, 43] \n[3, 5, 11, 16, 32, 38] \n[7, 11, 16, 35, 36, 44] \n[1, 8, 11, 31, 41, 42] \n[13, 14, 16, 38, 42, 45] \n[7, 11, 30, 40, 42, 43] \n[2, 13, 22, 32, 38, 45] \n[1, 3, 5, 14, 22, 45]\n```\n\n- 당첨 내역을 출력한다.\n\n```\n3개 일치 (5,000원) - 1개\n4개 일치 (50,000원) - 0개\n5개 일치 (1,500,000원) - 0개\n5개 일치, 보너스 볼 일치 (30,000,000원) - 0개\n6개 일치 (2,000,000,000원) - 0개\n```\n\n- 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)\n\n```\n총 수익률은 62.5%입니다.\n```\n\n- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 \"[ERROR]\"로 시작해야 한다.\n\n```\n[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.\n```\n\n#### 실행 결과 예시\n\n```\n구입금액을 입력해 주세요.\n8000\n\n8개를 구매했습니다.\n[8, 21, 23, 41, 42, 43] \n[3, 5, 11, 16, 32, 38] \n[7, 11, 16, 35, 36, 44] \n[1, 8, 11, 31, 41, 42] \n[13, 14, 16, 38, 42, 45] \n[7, 11, 30, 40, 42, 43] \n[2, 13, 22, 32, 38, 45] \n[1, 3, 5, 14, 22, 45]\n\n당첨 번호를 입력해 주세요.\n1,2,3,4,5,6\n\n보너스 번호를 입력해 주세요.\n7\n\n당첨 통계\n---\n3개 일치 (5,000원) - 1개\n4개 일치 (50,000원) - 0개\n5개 일치 (1,500,000원) - 0개\n5개 일치, 보너스 볼 일치 (30,000,000원) - 0개\n6개 일치 (2,000,000,000원) - 0개\n총 수익률은 62.5%입니다.\n```\n\n---\n\n## 🎯 프로그래밍 요구 사항\n\n- JDK 17 버전에서 실행 가능해야 한다. **JDK 17에서 정상적으로 동작하지 않을 경우 0점 처리한다.**\n- 프로그램 실행의 시작점은 `Application`의 `main()`이다.\n- `build.gradle` 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다.\n- [Java 코드 컨벤션](https://github.com/woowacourse/woowacourse-docs/tree/master/styleguide/java) 가이드를 준수하며 프로그래밍한다.\n- 프로그램 종료 시 `System.exit()`를 호출하지 않는다.\n- 프로그램 구현이 완료되면 `ApplicationTest`의 모든 테스트가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.**\n- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다.\n- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.\n    - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.\n    - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.\n- 3항 연산자를 쓰지 않는다.\n- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.\n- JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.\n\n### 추가된 요구 사항\n\n- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.\n    - 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.\n- else 예약어를 쓰지 않는다.\n    - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.\n    - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.\n- Java Enum을 적용한다.\n- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.\n    - 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다. \n    - 단위 테스트 작성이 익숙하지 않다면 `test/java/lotto/LottoTest`를 참고하여 학습한 후 테스트를 구현한다.\n\n### 라이브러리\n\n- `camp.nextstep.edu.missionutils`에서 제공하는 `Randoms` 및 `Console`\n  API를 사용하여 구현해야 한다.\n    - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickUniqueNumbersInRange()`를 활용한다.\n    - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다.\n\n#### 사용 예시\n\n```java\nList\u003cInteger\u003e numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6);\n```\n\n### Lotto 클래스\n\n- 제공된 `Lotto` 클래스를 활용해 구현해야 한다.\n- `numbers`의 접근 제어자인 private을 변경할 수 없다.\n- `Lotto`에 필드(인스턴스 변수)를 추가할 수 없다.\n- `Lotto`의 패키지 변경은 가능하다.\n\n```java\npublic class Lotto {\n    private final List\u003cInteger\u003e numbers;\n\n    public Lotto(List\u003cInteger\u003e numbers) {\n        validate(numbers);\n        this.numbers = numbers;\n    }\n\n    private void validate(List\u003cInteger\u003e numbers) {\n        if (numbers.size() != 6) {\n            throw new IllegalArgumentException();\n        }\n    }\n\n    // TODO: 추가 기능 구현\n}\n```\n\n---\n\n## ✏️ 과제 진행 요구 사항\n\n- 미션은 [java-lotto-6](https://github.com/woowacourse-precourse/java-lotto-6) 저장소를 Fork \u0026 Clone해 시작한다.\n- **기능을 구현하기 전 `docs/README.md`에 구현할 기능 목록을 정리**해 추가한다.\n- **Git의 커밋 단위는 앞 단계에서 `docs/README.md`에 정리한 기능 목록 단위**로 추가한다.\n    - [커밋 메시지 컨벤션](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 가이드를 참고해 커밋 메시지를 작성한다.\n- 과제 진행 및 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서를 참고한다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoxknow%2Fjava-lotto-6-mirror","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoxknow%2Fjava-lotto-6-mirror","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoxknow%2Fjava-lotto-6-mirror/lists"}