diff --git a/README.md b/README.md
index 81b03cdba2..923aa6c5e4 100644
--- a/README.md
+++ b/README.md
@@ -1,207 +1,28 @@
-# ๊ณผ์ - ๋ก๋
-
-## ๐ ์งํ ๋ฐฉ์
-
-- ๊ณผ์ ๋ **๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ, ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ, ๊ณผ์ ์งํ ์๊ตฌ ์ฌํญ** ์ธ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
-- ์ธ ๊ฐ์ ์๊ตฌ ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๋ค. ํนํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๋ง๋ค๊ณ , ๊ธฐ๋ฅ ๋จ์๋ก ์ปค๋ฐ ํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
-- ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ์ ๊ธฐ์ฌ๋์ง ์์ ๋ด์ฉ์ ์ค์ค๋ก ํ๋จํ์ฌ ๊ตฌํํ๋ค.
-
----
-
-## ๐ ๊ณผ์ ์งํ ๋ฐ ์ ์ถ ๋ฐฉ๋ฒ
-
-- ๊ณผ์ ๋ [java-lotto](https://github.com/LandvibeDev/java-lotto) ์ ์ฅ์๋ฅผ Fork/Cloneํด ์์ํ๋ค.
-- **๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ ์ java-baseball-precourse/README.md ํ์ผ์ ๊ตฌํํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์ ๋ฆฌ**ํด ์ถ๊ฐํ๋ค.
-- **Git์ ์ปค๋ฐ ๋จ์๋ ์ ๋จ๊ณ์์ README.md ํ์ผ์ ์ ๋ฆฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก ๋จ์**๋ก ์ถ๊ฐํ๋ค.
- - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) ์ฐธ๊ณ ํด commit log๋ฅผ ๋จ๊ธด๋ค.
-- ๊ณผ์ ์งํ ๋ฐ ์ ์ถ ๋ฐฉ๋ฒ์ [์ฐ์ํ์ฝ์ค ๊ณผ์ ์ ์ถ ๋ฌธ์](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) ๋ฅผ ์ฐธ๊ณ ํ๋ค.
- - base repository๋ฅผ `LandvibeDev/java-lotto`๋ก ์ง์ ํด์ PR ์์ฑํ๋ฉด๋จ
-
-
-
-### ํ
์คํธ ์คํ ๊ฐ์ด๋
-
-- ํฐ๋ฏธ๋์์ `java -version`์ ์คํํ์ฌ Java ๋ฒ์ ์ด 14์ธ์ง ํ์ธํ๋ค. ๋๋ Eclipse ๋๋ IntelliJ IDEA์ ๊ฐ์ IDE์์ Java 14๋ก ์คํ๋๋์ง ํ์ธํ๋ค.
-- ํฐ๋ฏธ๋์์ Mac ๋๋ Linux ์ฌ์ฉ์์ ๊ฒฝ์ฐ `./gradlew clean test` ๋ช
๋ น์ ์คํ ํ๊ณ ,
- Windows ์ฌ์ฉ์์ ๊ฒฝ์ฐ `gradlew.bat clean test` ๋ช
๋ น์ ์คํํ ๋ ๋์ ํ๋์ง ๋ง ํ์ธ(ํ
์คํธ๋ ์คํจ).
-
----
-
-## ๐ ๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ
-
-๋ก๋ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค. ๋ก๋ ๊ฒ์์ ์๋์ ๊ฐ์ ๊ท์น์ผ๋ก ์งํ๋๋ค.
-
-```
-- ๋ก๋ ๋ฒํธ์ ์ซ์ ๋ฒ์๋ 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์์ด๋ค.
-- ๋น์ฒจ ๋ฒํธ์ ๋ณด๋์ค ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๋๋ค.
-- ์ฌ์ฉ์๊ฐ ๊ตฌ๋งคํ ๋ก๋ ๋ฒํธ์ ๋น์ฒจ ๋ฒํธ๋ฅผ ๋น๊ตํ์ฌ ๋น์ฒจ ๋ด์ญ ๋ฐ ์์ต๋ฅ ์ ์ถ๋ ฅํ๊ณ ๋ก๋ ๊ฒ์์ ์ข
๋ฃํ๋ค.
-- ์ฌ์ฉ์๊ฐ ์๋ชป๋ ๊ฐ์ ์
๋ ฅํ ๊ฒฝ์ฐ `IllegalArgumentException`๋ฅผ ๋ฐ์์ํค๊ณ , "[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%์
๋๋ค.
-```
-
----
-
-## ๐ฏ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ
-
-- JDK 14 ๋ฒ์ ์์ ์คํ ๊ฐ๋ฅํด์ผ ํ๋ค.
-- ํ๋ก๊ทธ๋จ ์คํ์ ์์์ ์ `Application`์ `main()`์ด๋ค.
-- `build.gradle` ํ์ผ์ ๋ณ๊ฒฝํ ์ ์๊ณ , ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
-- [Java ์ฝ๋ ์ปจ๋ฒค์
](https://naver.github.io/hackday-conventions-java/) ๊ฐ์ด๋๋ฅผ ์ค์ํ๋ฉฐ ํ๋ก๊ทธ๋๋ฐํ๋ค.
-- ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์ `System.exit()`๋ฅผ ํธ์ถํ์ง ์๋๋ค.
-- ํ๋ก๊ทธ๋จ ๊ตฌํ์ด ์๋ฃ๋๋ฉด `ApplicationTest`์ ๋ชจ๋ ํ
์คํธ๊ฐ ์ฑ๊ณตํด์ผ ํ๋ค.
-- ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ์์ ๋ฌ๋ฆฌ ๋ช
์ํ์ง ์๋ ํ ํ์ผ, ํจํค์ง ์ด๋ฆ์ ์์ ํ๊ฑฐ๋ ์ด๋ํ์ง ์๋๋ค.
-- indent(์ธ๋ดํธ, ๋ค์ฌ์ฐ๊ธฐ) depth๋ฅผ 3์ด ๋์ง ์๋๋ก ๊ตฌํํ๋ค. 2๊น์ง๋ง ํ์ฉํ๋ค.
- - ์๋ฅผ ๋ค์ด while๋ฌธ ์์ if๋ฌธ์ด ์์ผ๋ฉด ๋ค์ฌ์ฐ๊ธฐ๋ 2์ด๋ค.
- - ํํธ: indent(์ธ๋ดํธ, ๋ค์ฌ์ฐ๊ธฐ) depth๋ฅผ ์ค์ด๋ ์ข์ ๋ฐฉ๋ฒ์ ํจ์(๋๋ ๋ฉ์๋)๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋๋ค.
-- 3ํญ ์ฐ์ฐ์๋ฅผ ์ฐ์ง ์๋๋ค.
-- ํจ์(๋๋ ๋ฉ์๋)๊ฐ ํ ๊ฐ์ง ์ผ๋ง ํ๋๋ก ์ต๋ํ ์๊ฒ ๋ง๋ค์ด๋ผ.
-- JUnit 5์ AssertJ๋ฅผ ์ด์ฉํ์ฌ ๋ณธ์ธ์ด ์ ๋ฆฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก์ด ์ ์ ๋์ํจ์ ํ
์คํธ ์ฝ๋๋ก ํ์ธํ๋ค.
-- ํจ์(๋๋ ๋ฉ์๋)์ ๊ธธ์ด๊ฐ 15๋ผ์ธ์ ๋์ด๊ฐ์ง ์๋๋ก ๊ตฌํํ๋ค.
- - ํจ์(๋๋ ๋ฉ์๋)๊ฐ ํ ๊ฐ์ง ์ผ๋ง ์ ํ๋๋ก ๊ตฌํํ๋ค.
-- else ์์ฝ์ด๋ฅผ ์ฐ์ง ์๋๋ค.
- - ํํธ: if ์กฐ๊ฑด์ ์์ ๊ฐ์ returnํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ฉด else๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
- - else๋ฅผ ์ฐ์ง ๋ง๋ผ๊ณ ํ๋ switch/case๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ switch/case๋ ํ์ฉํ์ง ์๋๋ค.
-- Java Enum์ ์ ์ฉํ๋ค.
-- ๋๋ฉ์ธ ๋ก์ง์ ๋จ์ ํ
์คํธ๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๋จ, UI(System.out, System.in, Scanner) ๋ก์ง์ ์ ์ธํ๋ค.
- - ํต์ฌ ๋ก์ง์ ๊ตฌํํ๋ ์ฝ๋์ UI๋ฅผ ๋ด๋นํ๋ ๋ก์ง์ ๋ถ๋ฆฌํด ๊ตฌํํ๋ค.
-
-### ๋ผ์ด๋ธ๋ฌ๋ฆฌ
-
-- [`camp.nextstep.edu.missionutils`](https://github.com/woowacourse-projects/mission-utils)์์ ์ ๊ณตํ๋ `Randoms` ๋ฐ `Console` API๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ผ ํ๋ค.
- - Random ๊ฐ ์ถ์ถ์ `camp.nextstep.edu.missionutils.Randoms`์ `pickUniqueNumbersInRange()`๋ฅผ ํ์ฉํ๋ค.
- - ์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ ๊ฐ์ `camp.nextstep.edu.missionutils.Console`์ `readLine()`์ ํ์ฉํ๋ค.
-
-#### ์ฌ์ฉ ์์
-
-```java
-List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6);
-```
-
-### Lotto ํด๋์ค
-
-- ์ ๊ณต๋ `Lotto` ํด๋์ค๋ฅผ ํ์ฉํด ๊ตฌํํด์ผ ํ๋ค.
-- `Lotto`์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์์ฑ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
-- `numbers`์ ์ ๊ทผ ์ ์ด์์ธ private์ ๋ณ๊ฒฝํ ์ ์๋ค.
-- `Lotto`์ ํ๋(์ธ์คํด์ค ๋ณ์)๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
-- `Lotto`์ ํจํค์ง ๋ณ๊ฒฝ์ ๊ฐ๋ฅํ๋ค.
-
-```java
-public class Lotto {
- private final List numbers;
-
- public Lotto(List numbers) {
- validate(numbers);
- this.numbers = numbers;
- }
-
- private void validate(List numbers) {
- if (numbers.size() != 6) {
- throw new IllegalArgumentException();
- }
- }
-
- // TODO: ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
-}
-```
+|-- game
+| |--CountMatch (์ซ์ ์ผ์น์ฌ๋ถ ํ๋ณ, ๋น์ฒจ์ก ํ๋ณ)
+| |--Game (๊ฒ์ ์์)
+| |--MakeNumber (๋๋ค ๋ฒํธ ์ถ์ถ)
+|-- input
+| |--CheckInput (input ์์ธ ํ๋ณ)
+| |--Input (๊ตฌ์
๊ธ์ก, ๋น์ฒจ ๋ฒํธ, ๋ณด๋์ค ๋ฒํธ ์
๋ ฅ)
+|-- lotto
+| |--Lotto (๋ก๋)
+|-- print
+| |--Print (๋ด์ฒญ ํต๊ณ, ๋๋ค ๋ฒํธ, ์์ต๋ฅ ์ถ๋ ฅ)
+|-- result
+| |--Awards (๋ณด์๊ธ ์ฑ
์ )
+| |--Count (๋ก๋ ๋น์ฒจ ์๋ ๊ฒฐ๊ณผ ํต๊ณ)
+| |--Result (๋ก๋ ์ผ์น์ฌ๋ถ ๊ณ์ฐ๊ธฐ)
+|-- user
+| |--User (์ ์ ๋ณ ํ๊ธ์ก)
+
+
+
+#๊ธฐ๋ฅ๊ตฌํ
+1. ๊ตฌ๋งค ๊ธ์ก ์
๋ ฅ๋ฐ๊ธฐ
+2. ๊ตฌ๋งค ์๋ ํ์ธ
+3. ์๋์ ๋ฐ๋ฅธ ๋ก๋ ๋ฒํธ ์์ฑ
+4. ์์ฑ๋ ๋ก๋ ๋ฒํธ ๋ณด์ฌ์ฃผ๊ธฐ
+5. ๋น์ฒจ ๋ฒํธ, ๋ณด๋์ค ๋ฒํธ ์
๋ ฅ
+6. ๊ฒฐ๊ณผ ์ง๊ณ
+7. ๊ฒฐ๊ณผ ์ถ๋ ฅ
diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java
index 367ee30584..17afb27e84 100644
--- a/src/main/java/lotto/Application.java
+++ b/src/main/java/lotto/Application.java
@@ -1,7 +1,22 @@
package lotto;
+import lotto.game.game.CountMatch;
+import lotto.game.game.LottoCountMatch;
+import lotto.game.game.Game;
+import lotto.game.game.LottoGame;
+import lotto.game.input.Input;
+import lotto.game.input.LottoInput;
+import lotto.game.print.LottoPrint;
+import lotto.game.print.Print;
+
public class Application {
public static void main(String[] args) {
// TODO: ํ๋ก๊ทธ๋จ ๊ตฌํ
+ Input input = new LottoInput();
+ Print print = new LottoPrint();
+ CountMatch countMatch = new LottoCountMatch();
+
+ Game lottoGame = new LottoGame(input, print, countMatch);
+ lottoGame.start();
}
}
\ No newline at end of file
diff --git a/src/main/java/lotto/game/constant/InputMessage.java b/src/main/java/lotto/game/constant/InputMessage.java
new file mode 100644
index 0000000000..363c3f04a8
--- /dev/null
+++ b/src/main/java/lotto/game/constant/InputMessage.java
@@ -0,0 +1,18 @@
+package lotto.game.constant;
+
+public enum InputMessage {
+
+ INPUT_PURCHASE_PRICE("๊ตฌ์
๊ธ์ก์ ์
๋ ฅํด ์ฃผ์ธ์."),
+ INPUT_NUMBERS("๋น์ฒจ ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์"),
+ INPUT_BONUS_NUMBER("๋ณด๋์ค ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์");
+
+ private final String string;
+
+ InputMessage(String string){
+ this.string = string;
+ }
+
+ public String getString(){
+ return string;
+ }
+}
diff --git a/src/main/java/lotto/game/constant/NumberRange.java b/src/main/java/lotto/game/constant/NumberRange.java
new file mode 100644
index 0000000000..cfe09ef30a
--- /dev/null
+++ b/src/main/java/lotto/game/constant/NumberRange.java
@@ -0,0 +1,24 @@
+package lotto.game.constant;
+
+public enum NumberRange {
+ RESULT_START(3),
+ RESULT_END(6),
+ RANDOM_START(1),
+ RANDOM_END(45),
+ RANDOM_COUNT(6);
+
+ public int value() {
+ return value;
+ }
+
+ private final int value;
+
+ NumberRange(int value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
diff --git a/src/main/java/lotto/game/constant/WinningReward.java b/src/main/java/lotto/game/constant/WinningReward.java
new file mode 100644
index 0000000000..1378ea4266
--- /dev/null
+++ b/src/main/java/lotto/game/constant/WinningReward.java
@@ -0,0 +1,24 @@
+package lotto.game.constant;
+
+public enum WinningReward {
+ SIX_RIGHT(2000000000),
+ FIVE_AND_BONUS_RIGHT(30000000),
+ FIVE_RIGHT(1500000),
+ FOUR_RIGHT(50000),
+ THREE_RIGHT(5000);
+
+ public int value() {
+ return value;
+ }
+
+ private final int value;
+
+ WinningReward(int value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
diff --git a/src/main/java/lotto/game/game/CountMatch.java b/src/main/java/lotto/game/game/CountMatch.java
new file mode 100644
index 0000000000..9d034b3d78
--- /dev/null
+++ b/src/main/java/lotto/game/game/CountMatch.java
@@ -0,0 +1,11 @@
+package lotto.game.game;
+
+import lotto.game.lotto.Lotto;
+import lotto.game.lotto.LottoCount;
+
+import java.util.List;
+
+public interface CountMatch {
+ LottoCount countMatchNumber(List winningNumber, Integer bonusNumber, Lotto lotto);
+ int countMatchReward(LottoCount lottoCount);
+}
diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java
new file mode 100644
index 0000000000..f08ae05b57
--- /dev/null
+++ b/src/main/java/lotto/game/game/Game.java
@@ -0,0 +1,5 @@
+package lotto.game.game;
+
+public interface Game {
+ void start();
+}
diff --git a/src/main/java/lotto/game/game/LottoCountMatch.java b/src/main/java/lotto/game/game/LottoCountMatch.java
new file mode 100644
index 0000000000..d8bf1b3843
--- /dev/null
+++ b/src/main/java/lotto/game/game/LottoCountMatch.java
@@ -0,0 +1,52 @@
+package lotto.game.game;
+
+import lotto.game.lotto.Lotto;
+import lotto.game.lotto.LottoCount;
+import java.util.List;
+
+import static lotto.game.constant.WinningReward.*;
+
+public class LottoCountMatch implements CountMatch {
+ @Override
+ public LottoCount countMatchNumber(List winningNumber, Integer bonusNumber, Lotto lotto) {
+ int cnt = 0;
+ int bonusCnt = 0;
+ ListlottoNumber = lotto.getLottoNumber();
+ for (Integer num : lottoNumber) {
+ if (winningNumber.contains(num)) {
+ cnt++;
+ }
+ }
+ if(lottoNumber.contains(bonusNumber)){
+ bonusCnt++;
+ }
+ LottoCount lottoCount = new LottoCount(cnt,bonusCnt);
+
+ return lottoCount; // lottoCount ๊ฐ์ฒด๋ก ๋ฐํ
+ }
+ @Override
+ public int countMatchReward(LottoCount lottoCount){
+ int reward = 0;
+ int cnt = lottoCount.getCnt();
+ int bonusCnt = lottoCount.getBonusCnt();
+
+ if(cnt==3){
+ reward += THREE_RIGHT.value();
+ }
+ if(cnt==4){
+ reward += FOUR_RIGHT.value();
+ }
+ if(cnt==5){
+ if(bonusCnt==1){
+ reward += FIVE_AND_BONUS_RIGHT.value();
+ }
+ if(bonusCnt==0){
+ reward += FIVE_RIGHT.value();
+ }
+ }
+ if(cnt==6){
+ reward += SIX_RIGHT.value();
+ }
+ return reward; // lottoCount ๊ฐ์ฒด reward ๊ณ์ฐ ํ return
+ }
+}
diff --git a/src/main/java/lotto/game/game/LottoGame.java b/src/main/java/lotto/game/game/LottoGame.java
new file mode 100644
index 0000000000..b35399a9ce
--- /dev/null
+++ b/src/main/java/lotto/game/game/LottoGame.java
@@ -0,0 +1,72 @@
+package lotto.game.game;
+
+import lotto.game.input.Input;
+import lotto.game.lotto.Lotto;
+import lotto.game.print.Print;
+import lotto.game.lotto.LottoCount;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static lotto.game.game.MakeNumber.makeRandomLottoNumbers;
+
+public class LottoGame implements Game{
+
+ private final Input input;
+ private final Print print;
+ private final CountMatch countMatch;
+
+ public LottoGame(Input input, Print print, CountMatch countMatch){
+ this.input = input;
+ this.print = print;
+ this.countMatch = countMatch;
+ }
+
+ @Override
+ public void start() {
+ // 1. ์๋ ์
๋ ฅ๋ฐ๊ธฐ
+ Integer purchaseMoney = input.getPurchaseMoney();
+ if(purchaseMoney==-1){
+ // error ๋ฐ์
+ return;
+ }
+
+ // 2. ๊ตฌ๋งค์๋ check
+ int cycle = purchaseMoney / 1000;
+ print.printPurchaseCount(cycle);
+
+ // 3. ์๋๋งํผ ๋ก๋ ๋ฒํธ ์์ฑ
+ List lottoList = makeRandomLottoNumbers(cycle);
+
+ // 4. ์์ฑ๋ ๋ก๋๋ฒํธ ๋ณด์ฌ์ฃผ๊ธฐ
+ print.printNumberList(lottoList);
+
+ // 5. ๋น์ฒจ ๋ฒํธ, ๋ณด๋์ค ๋ฒํธ ์
๋ ฅ๋ฐ๊ธฐ
+ ArrayList winningNumber = input.getWinningNumbers();
+ Integer bonusNumber = input.getBonusNumber();
+
+
+ // 6. ๊ฒฐ๊ณผ ์ง๊ณ !!!
+ ListlottoCountList = new ArrayList<>();
+ for(Lotto lotto : lottoList){
+ LottoCount lottoCount = countMatch.countMatchNumber(winningNumber, bonusNumber, lotto);
+ lottoCountList.add(lottoCount);
+ }
+
+ int totalReward = 0;
+ for(LottoCount lottoCount : lottoCountList){
+ int reward = countMatch.countMatchReward(lottoCount);
+ totalReward += reward;
+ }
+
+
+ // 7. ๊ฒฐ๊ณผ ์ถ๋ ฅ
+ print.printResultStart();
+ print.printResult(lottoCountList);
+ print.printRateOfReturn(purchaseMoney,totalReward);
+ }
+
+
+
+
+}
diff --git a/src/main/java/lotto/game/game/MakeNumber.java b/src/main/java/lotto/game/game/MakeNumber.java
new file mode 100644
index 0000000000..ed8aa74ed6
--- /dev/null
+++ b/src/main/java/lotto/game/game/MakeNumber.java
@@ -0,0 +1,24 @@
+package lotto.game.game;
+
+import camp.nextstep.edu.missionutils.Randoms;
+import lotto.game.lotto.Lotto;
+import java.util.List;
+
+import static lotto.game.constant.NumberRange.*;
+
+public class MakeNumber {
+
+ public static List makeRandomLottoNumbers(int cycle, ListlottoList) {
+ for (int i = 0; i < cycle; i++) {
+ // ๋ก๋ ๋ฒํธ ์์ฑ
+ List numbers = Randoms.pickUniqueNumbersInRange(RANDOM_START.value(), RANDOM_END.value(), RANDOM_COUNT.value());
+ // ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
+ //Collections.sort(numbers);
+
+ // ๋ก๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๋ก๋ ๋ฆฌ์คํธ์ ๋ฃ์ด์ฃผ๊ธฐ
+ Lotto lotto = new Lotto(numbers);
+ lottoList.add(lotto);
+ }
+ return lottoList;
+ }
+}
diff --git a/src/main/java/lotto/game/input/CheckInput.java b/src/main/java/lotto/game/input/CheckInput.java
new file mode 100644
index 0000000000..459007b6df
--- /dev/null
+++ b/src/main/java/lotto/game/input/CheckInput.java
@@ -0,0 +1,19 @@
+package lotto.game.input;
+
+public class CheckInput {
+
+ static void purchaseCheck(String str) {
+
+ int number;
+ try {
+ number = Integer.parseInt(str);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("[ERROR] ์ซ์ ํ์์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค");
+ }
+
+ if (number % 1000 != 0 || number < 1000) {
+ throw new IllegalArgumentException("[ERROR] 1000์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ์๋ง ์
๋ ฅํ์ธ์");
+ }
+ }
+
+}
diff --git a/src/main/java/lotto/game/input/Input.java b/src/main/java/lotto/game/input/Input.java
new file mode 100644
index 0000000000..b841e2df10
--- /dev/null
+++ b/src/main/java/lotto/game/input/Input.java
@@ -0,0 +1,12 @@
+package lotto.game.input;
+
+import java.util.ArrayList;
+
+public interface Input {
+
+ ArrayList getWinningNumbers();
+
+ Integer getPurchaseMoney();
+
+ Integer getBonusNumber();
+}
diff --git a/src/main/java/lotto/game/input/LottoInput.java b/src/main/java/lotto/game/input/LottoInput.java
new file mode 100644
index 0000000000..0f3b51e437
--- /dev/null
+++ b/src/main/java/lotto/game/input/LottoInput.java
@@ -0,0 +1,48 @@
+package lotto.game.input;
+
+import camp.nextstep.edu.missionutils.Console;
+import java.util.ArrayList;
+
+import static lotto.game.constant.InputMessage.*;
+
+public class LottoInput implements Input {
+
+ @Override
+ public Integer getPurchaseMoney() {
+ System.out.println(INPUT_PURCHASE_PRICE.getString());
+ String str = Console.readLine();
+
+ try {
+ CheckInput.purchaseCheck(str);
+ }catch (IllegalArgumentException e){
+ System.out.println(e.getMessage());
+ return -1;
+ }
+
+ int purchase = Integer.parseInt(str);
+ System.out.println();
+ return purchase;
+ }
+
+ @Override
+ public ArrayList getWinningNumbers() {
+ System.out.println(INPUT_NUMBERS.getString());
+ String str = Console.readLine();
+ String[] split = str.split(",");
+
+ ArrayListarrayList = new ArrayList<>();
+ for (String s : split) {
+ arrayList.add(Integer.valueOf(s));
+ }
+ System.out.println();
+ return arrayList;
+ }
+
+ @Override
+ public Integer getBonusNumber() {
+ System.out.println(INPUT_BONUS_NUMBER.getString());
+ Integer bonusNumber = Integer.valueOf(Console.readLine());
+ System.out.println();
+ return bonusNumber;
+ }
+}
diff --git a/src/main/java/lotto/game/lotto/Lotto.java b/src/main/java/lotto/game/lotto/Lotto.java
new file mode 100644
index 0000000000..6124fa2fc7
--- /dev/null
+++ b/src/main/java/lotto/game/lotto/Lotto.java
@@ -0,0 +1,24 @@
+package lotto.game.lotto;
+
+import java.util.List;
+
+public class Lotto {
+ private final List numbers;
+
+ public List getLottoNumber(){
+ return this.numbers;
+ }
+
+ public Lotto(List numbers) {
+ validate(numbers);
+ this.numbers = numbers;
+ }
+
+ private void validate(List numbers) {
+ if (numbers.size() != 6) {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ // TODO: ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
+}
\ No newline at end of file
diff --git a/src/main/java/lotto/game/print/LottoPrint.java b/src/main/java/lotto/game/print/LottoPrint.java
new file mode 100644
index 0000000000..2d97e13d23
--- /dev/null
+++ b/src/main/java/lotto/game/print/LottoPrint.java
@@ -0,0 +1,80 @@
+package lotto.game.print;
+
+import lotto.game.lotto.Lotto;
+import lotto.game.result.LottoCount;
+
+import java.text.DecimalFormat;
+import java.util.List;
+import static lotto.game.constant.NumberRange.*;
+
+public class LottoPrint implements Print{
+
+ private final int[] awards = new int[10];
+
+ @Override
+ public void printResultStart(){
+ System.out.println("๋น์ฒจ ํต๊ณ");
+ System.out.println("---");
+ }
+ @Override
+ public void printNumberList(List lottoList) {
+ for (Lotto lotto : lottoList) {
+ System.out.println(lotto.getLottoNumber());
+ }
+ System.out.println();
+ }
+ @Override
+ public void printRateOfReturn(Integer purchaseMoney, Integer rewards) {
+ double percent = (double) rewards / purchaseMoney * 100;
+ double roundedPercent = Math.round(percent * 10.0) / 10.0;
+ System.out.println("์ด ์์ต๋ฅ ์ " + roundedPercent+"%์
๋๋ค.");
+ }
+
+ @Override
+ public void printResult(ListlottoCountList){
+ awards[3]=5000;
+ awards[4]=50000;
+ awards[5]=1500000;
+ awards[6]=2000000000;
+ int bonusAwards = 30000000;
+
+ int[] result = new int[10];
+ int[] bonusResult = new int[10];
+
+ for(LottoCount lottoCount : lottoCountList){
+ int cnt = lottoCount.getCnt();
+ int bonusCnt = lottoCount.getBonusCnt();
+
+ result[cnt]++;
+ if(bonusCnt==1){
+ bonusResult[cnt]++;
+ }
+ }
+ for(int i = RESULT_START.value(); i<= RESULT_END.value(); i++){
+ String printMessage = "";
+ printMessage += i+"๊ฐ ์ผ์น ";
+ // 5000์
+ DecimalFormat decimalFormat = new DecimalFormat("#,###");
+ String formattedValue = "(" + decimalFormat.format(awards[i]) + "์) - ";
+ printMessage += formattedValue;
+ printMessage += result[i]+"๊ฐ";
+
+
+ if(i==5){
+ printMessage += '\n';
+ printMessage += i+"๊ฐ ์ผ์น, ๋ณด๋์ค ๋ณผ ์ผ์น ";
+ formattedValue = "(" + decimalFormat.format(bonusAwards) + "์) - ";
+ printMessage+=formattedValue;
+ printMessage += bonusResult[i]+"๊ฐ";
+ }
+
+ System.out.println(printMessage);
+ }
+ }
+
+
+ @Override
+ public void printPurchaseCount(int cnt){
+ System.out.println(cnt + "๊ฐ๋ฅผ ๊ตฌ๋งคํ์ต๋๋ค.");
+ }
+}
diff --git a/src/main/java/lotto/game/print/Print.java b/src/main/java/lotto/game/print/Print.java
new file mode 100644
index 0000000000..1c3966ce62
--- /dev/null
+++ b/src/main/java/lotto/game/print/Print.java
@@ -0,0 +1,18 @@
+package lotto.game.print;
+
+import lotto.game.lotto.Lotto;
+import lotto.game.result.LottoCount;
+
+import java.util.List;
+
+public interface Print {
+ void printNumberList(List lottoList);
+
+ void printResultStart();
+
+ void printResult(ListlottoCountList);
+
+ void printRateOfReturn(Integer purchaseMoney, Integer rewards);
+
+ void printPurchaseCount(int cnt);
+}
diff --git a/src/main/java/lotto/game/result/LottoCount.java b/src/main/java/lotto/game/result/LottoCount.java
new file mode 100644
index 0000000000..eff08c4c02
--- /dev/null
+++ b/src/main/java/lotto/game/result/LottoCount.java
@@ -0,0 +1,20 @@
+package lotto.game.result;
+
+public class LottoCount {
+
+ private final int cnt; // ๋ช๊ฐ ๋น์ฒจ์ธ์ง
+ private final int bonusCnt;
+
+ public LottoCount(int cnt, int bonusCnt){
+ this.cnt=cnt;
+ this.bonusCnt = bonusCnt;
+ }
+
+ public int getCnt() {
+ return cnt;
+ }
+
+ public int getBonusCnt() {
+ return bonusCnt;
+ }
+}
diff --git a/src/test/java/lotto/game/game/LottoCountMatchTest.java b/src/test/java/lotto/game/game/LottoCountMatchTest.java
new file mode 100644
index 0000000000..b6a855cabe
--- /dev/null
+++ b/src/test/java/lotto/game/game/LottoCountMatchTest.java
@@ -0,0 +1,66 @@
+package lotto.game.game;
+
+import lotto.game.lotto.Lotto;
+import lotto.game.lotto.LottoCount;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
+
+import static lotto.game.constant.WinningReward.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class LottoCountMatchTest {
+
+ LottoCountMatch lottoCountMatch = new LottoCountMatch();
+
+ @ParameterizedTest(name = "[{index}] winning : {0} bonus : {1} myNum : {2} ํ
์คํธ")
+ @MethodSource()
+ void countMatchNumber(ListwinningNumber, int bonusNumber, Listnumbers,
+ int expectedCnt, int expectedBonusCnt) {
+ //
+ Lotto lotto = new Lotto(numbers);
+
+ //
+ LottoCount lottoCount = lottoCountMatch.countMatchNumber(winningNumber, bonusNumber, lotto);
+
+ //
+ assertEquals(expectedCnt,lottoCount.getCnt(),"cnt ๊ฐ์ด ํ๋ฆฝ๋๋ค.");
+ assertEquals(expectedBonusCnt,lottoCount.getBonusCnt(),"bonusCnt ๊ฐ์ด ํ๋ฆฝ๋๋ค.");
+ }
+ static Stream countMatchNumber() {
+ return Stream.of(
+ Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 6),7,Arrays.asList(1, 2, 3, 4, 5, 7),5,1),
+ Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 6),7,Arrays.asList(1, 2, 3, 4, 5, 6),6,0),
+ Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 6),7,Arrays.asList(4, 5, 6, 7, 8, 9),3,1)
+ );
+ }
+
+ @ParameterizedTest(name = "[{index}] cnt : {0} bonusCnt : {1} expectedResult : {2} ํ
์คํธ")
+ @MethodSource()
+ void countMatchReward(int cnt, int bonusCnt, int expectedResult) {
+ //
+ LottoCount lottoCount = new LottoCount(cnt,bonusCnt);
+
+ //
+ int reward = lottoCountMatch.countMatchReward(lottoCount);
+
+ //
+ assertEquals(expectedResult,reward);
+ }
+ static Stream countMatchReward() {
+ return Stream.of(
+ Arguments.of(6,0,SIX_RIGHT.value()),
+ Arguments.of(5,1,FIVE_AND_BONUS_RIGHT.value()),
+ Arguments.of(5,0,FIVE_RIGHT.value()),
+ Arguments.of(4,0,FOUR_RIGHT.value()),
+ Arguments.of(3,0,THREE_RIGHT.value()),
+ Arguments.of(2,0,0),
+ Arguments.of(1,0,0),
+ Arguments.of(0,0,0)
+ );
+ }
+}
\ No newline at end of file