diff --git a/README.md b/README.md index 81b03cdba2..8faa313cfd 100644 --- a/README.md +++ b/README.md @@ -1,207 +1,93 @@ -# ๊ณผ์ œ - ๋กœ๋˜ - -## ๐Ÿ” ์ง„ํ–‰ ๋ฐฉ์‹ - -- ๊ณผ์ œ๋Š” **๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ, ๊ณผ์ œ ์ง„ํ–‰ ์š”๊ตฌ ์‚ฌํ•ญ** ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. -- ์„ธ ๊ฐœ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ๋‹ค. ํŠนํžˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ๋งŒ๋“ค๊ณ , ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ปค๋ฐ‹ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. -- ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ธฐ์žฌ๋˜์ง€ ์•Š์€ ๋‚ด์šฉ์€ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. - ---- - -## ๐Ÿ“ˆ ๊ณผ์ œ ์ง„ํ–‰ ๋ฐ ์ œ์ถœ ๋ฐฉ๋ฒ• - -- ๊ณผ์ œ๋Š” [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๏ธโƒฃ [์ž…๋ ฅ] ๊ตฌ์ž…ํ•  ๋กœ๋˜ ๊ธˆ์•ก ์ž…๋ ฅ๋ฐ›๊ธฐ ---- - -## ๐Ÿš€ ๊ธฐ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ - -๋กœ๋˜ ๊ฒŒ์ž„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋กœ๋˜ ๊ฒŒ์ž„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. - -``` -- ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 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์› -``` +- ์ฒœ์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ๋ฐ›์•„ *MyLottoData*์˜ *money*์— ๊ธˆ์•ก์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. +- ์˜ˆ์™ธ์ฒ˜๋ฆฌ +- **inputPurchasingMoney()**: void -- ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋งŒํผ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•œ๋‹ค. -- ๋กœ๋˜ 1์žฅ์˜ ๊ฐ€๊ฒฉ์€ 1,000์›์ด๋‹ค. -- ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. -- ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งคํ•œ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋‹น์ฒจ ๋‚ด์—ญ ๋ฐ ์ˆ˜์ต๋ฅ ์„ ์ถœ๋ ฅํ•˜๊ณ  ๋กœ๋˜ ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•œ๋‹ค. -- ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ `IllegalArgumentException`๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , "[ERROR]"๋กœ ์‹œ์ž‘ํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒํ•œ๋‹ค. - -## โœ๐Ÿป ์ž…์ถœ๋ ฅ ์š”๊ตฌ์‚ฌํ•ญ - -### โŒจ๏ธ ์ž…๋ ฅ - -- ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ 1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ๋‹ค. - -``` -14000 -``` +
-- ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. ๋ฒˆํ˜ธ๋Š” ์‰ผํ‘œ(,)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. +### 2๏ธโƒฃ [๊ณ„์‚ฐ] ๋กœ๋˜ ๋ฐœํ–‰ํ•˜๊ธฐ -``` -1,2,3,4,5,6 -``` +- ๊ตฌ์ž…ํ•  ๋กœ๋˜ ๊ธˆ์•ก์œผ๋กœ๋ถ€ํ„ฐ ๋กœ๋˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ๊ฐœ์ˆ˜๋ฅผ *MyLottoData*์˜ *quantity*์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. +- ๊ฐœ์ˆ˜๋งŒํผ ๋กœ๋˜๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋ฐœํ–‰ํ•ด์„œ *MyLottoData*์˜ *lottoSet*์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. +- **issueLottoMultiSet()**: void -- ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. +
-``` -7 -``` +### 2๏ธโƒฃ [์ถœ๋ ฅ] ๊ตฌ์ž…ํ•œ ๋กœ๋˜ ์ถœ๋ ฅํ•˜๊ธฐ -### ๐Ÿ–ฅ ์ถœ๋ ฅ +- *MyLottoData*์˜ *lottoSet*์— ์ €์žฅ๋œ ๊ตฌ์ž…ํ•œ ๋กœ๋˜์˜ ๋ฒˆํ˜ธ๋“ค์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. +- **printPurchasedLotto()**: void -- ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. +
-``` -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๏ธโƒฃ [์ž…๋ ฅ] ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ž…๋ ฅ๋ฐ›๊ธฐ -- ๋‹น์ฒจ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค. +- ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ *WinnerLottoData*์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. +- ์˜ˆ์™ธ์ฒ˜๋ฆฌ +- **inputWinnerNumber()**: void +- **inputBonusNumber()**: void -``` -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%) +### 4๏ธโƒฃ [๊ณ„์‚ฐ] ๋กœ๋˜ ๋‹น์ฒจ ๊ฒฐ๊ณผ ๊ณ„์‚ฐํ•˜๊ธฐ -``` -์ด ์ˆ˜์ต๋ฅ ์€ 62.5%์ž…๋‹ˆ๋‹ค. -``` +- ๋ฐœํ–‰ํ•œ ๋กœ๋˜์™€ ๋‹น์ฒจ ๋ฒˆํ˜ธ, ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•˜์—ฌ *ResultLottoData*์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. +- **calculateResultLotto()**: void + - **countNumberOfLottoMatches(**Lotto**)**: int + - **isMatchWithBonusNumber(**Lotto**)**: boolean -- ์˜ˆ์™ธ ์ƒํ™ฉ ์‹œ ์—๋Ÿฌ ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ, ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” "[ERROR]"๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. -``` -[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. -``` +
-### ๐Ÿ’ป ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ +### 5๏ธโƒฃ [์ถœ๋ ฅ] ๋กœ๋˜ ๋‹น์ฒจ ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•˜๊ธฐ -``` -๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. -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%์ž…๋‹ˆ๋‹ค. -``` +- *ResultLottoData*์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹น์ฒจ ๊ฒฐ๊ณผ์™€ ์ˆ˜์ต๋ฅ ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. +- **printResultLotto()**: void ---- - -## ๐ŸŽฏ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ - -- 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(); - } - } +## ๐Ÿ—‚ ํด๋”๋ง + +``` +๐Ÿ“ฆ src/main/java/ +| ++ ๐Ÿ—‚ lotto/ +โ”‚ ++-------๐Ÿ…ฒ Application +| : main() ์กด์žฌ, LottoManager ํ˜ธ์ถœ +| ++-------๐Ÿ…ฒ LottoManager +| : ๋กœ๋˜๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํด๋ž˜์Šค +| ++-------๐Ÿ…ฒ Lotto +| : 6๊ฐœ์˜ ๋กœ๋˜ ์ˆซ์ž๊ฐ€ ์ €์žฅ๋˜๋Š” ํด๋ž˜์Šค +| ++-------๐Ÿ…ฒ MyLottoData +| : ๊ตฌ์ž… ๊ธˆ์•ก๊ณผ ๋ฐœํ–‰๋œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰๊ณผ ๋ฒˆํ˜ธ๊ฐ€ ์ €์žฅ๋˜๋Š” ํด๋ž˜์Šค +| ++-------๐Ÿ…ฒ WinnerLottoData +| : ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๊ฐ€ ์ €์žฅ๋˜๋Š” ํด๋ž˜์Šค +| ++-------๐Ÿ…ฒ ResultLottoData +| : ๋กœ๋˜ ๋‹น์ฒจ ๊ฒฐ๊ณผ์™€ ์ˆ˜์ต๋ฅ ์ด ์ €์žฅ๋˜๋Š” ํด๋ž˜์Šค +| ++-------๐Ÿ…ฒ Message +| : ์ƒ์ˆ˜ ๋ฉ”์„ธ์ง€๋“ค์„ ๋ชจ์•„๋†“์€ ํด๋ž˜์Šค +| ++-------๐Ÿ…ฒ Number +| : ์ƒ์ˆ˜ ์ˆซ์ž๋“ค์„ ๋ชจ์•„๋†“์€ ํด๋ž˜์Šค - // TODO: ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -} ``` diff --git a/build.gradle b/build.gradle index 1cd662974c..d844da4369 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ dependencies { java { toolchain { - languageVersion = JavaLanguageVersion.of(14) + languageVersion = JavaLanguageVersion.of(15) } } diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 367ee30584..de3822f8d5 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -2,6 +2,8 @@ public class Application { public static void main(String[] args) { - // TODO: ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„ + LottoManager lottoManager = new LottoManager(); + GameController game = new GameController(lottoManager); + game.play(); } } \ No newline at end of file diff --git a/src/main/java/lotto/GameController.java b/src/main/java/lotto/GameController.java new file mode 100644 index 0000000000..de6d002f9f --- /dev/null +++ b/src/main/java/lotto/GameController.java @@ -0,0 +1,90 @@ +package lotto; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; +import java.util.List; + +public class GameController { + + private final LottoManager lottoManager; + + public GameController(LottoManager lottoManager) { + this.lottoManager = lottoManager; + } + + public void play() { + System.out.println(Message.Input.PURCHASE_MONEY); + int money = readMoney(); + + int quantity = money / Number.Rule.PRICE.toNumber(); + List myLottoSet = new ArrayList<>(); + for (int i = 0; i < quantity; i++) { + Lotto lottoOneSet = lottoManager.generate(Number.Rule.MIN.toNumber(), + Number.Rule.MAX.toNumber(), Number.Rule.SIZE.toNumber()); + myLottoSet.add(lottoOneSet); + } + + System.out.println(Message.Output.PURCHASE_QUANTITY.toQuantityFormat(quantity)); + for (Lotto lotto : myLottoSet) { + System.out.println(lotto.getNumbers()); + } + + System.out.println(Message.Input.WINNER_NUMBER); + Lotto winnerNumber = readNumber(); + int bonusNumber = readBonus(); + + Score score = lottoManager.calculate(myLottoSet, winnerNumber, bonusNumber); + double rate = score.calculateRate(money); + System.out.println(Message.Output.RESULT_STAT); + System.out.println(score); + System.out.println(Message.Output.RESULT_RATE.toRateFormat(rate)); + } + + private int readMoney() { + String input = Console.readLine(); + for (char c : input.toCharArray()) { + if (c < '0' || c > '9') { + throw new IllegalArgumentException(Message.Error.PURCHASE_AMOUNT.toString()); + } + } + int purchaseMoney = Integer.parseInt(input); + if (purchaseMoney % Number.Rule.PRICE.toNumber() != 0) { + throw new IllegalArgumentException(Message.Error.PURCHASE_AMOUNT.toString()); + } + return Integer.parseInt(input); + } + + private Lotto readNumber() { + String input = Console.readLine(); + try { + String[] stringArray = input.split(","); + for (String str : stringArray) { + int num = Integer.parseInt(str); + } + } catch (Exception e) { + throw new IllegalArgumentException(Message.Error.LOTTO_NUMBER.toString()); + } + String[] stringArray = input.split(","); + List integerList = new ArrayList<>(); + for (String str : stringArray) { + int num = Integer.parseInt(str); + integerList.add(num); + } + return new Lotto(integerList); + } + + private int readBonus() { + String input = Console.readLine(); + try { + Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(Message.Error.BONUS_NUMBER.toString()); + } + int bonusNumber = Integer.parseInt(input); + if (bonusNumber < Number.Rule.MIN.toNumber() || bonusNumber > Number.Rule.MAX.toNumber()) { + throw new IllegalArgumentException(Message.Error.BONUS_NUMBER.toString()); + } + return bonusNumber; + } +} \ No newline at end of file diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java new file mode 100644 index 0000000000..96f98c68c3 --- /dev/null +++ b/src/main/java/lotto/Lotto.java @@ -0,0 +1,26 @@ +package lotto; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.Collections; +import java.util.ArrayList; +import java.util.List; + +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(); + } + } + + public List getNumbers() { + return numbers; + } +} \ No newline at end of file diff --git a/src/main/java/lotto/LottoManager.java b/src/main/java/lotto/LottoManager.java new file mode 100644 index 0000000000..a0dec31427 --- /dev/null +++ b/src/main/java/lotto/LottoManager.java @@ -0,0 +1,56 @@ +package lotto; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class LottoManager { + public Lotto generate(int min, int max, int size) { + List lottoOneList = Randoms.pickUniqueNumbersInRange(min, max, size); + return new Lotto(lottoOneList); + } + + public Score calculate(List myLottoSet, Lotto winnerLotto, int bonusNumber) { + int threeMatchCount = 0; + int fourMatchCount = 0; + int fiveMatchCount = 0; + int fiveAndBonusMatchCount = 0; + int sixMatchCount = 0; + for (Lotto myLottoOneSet : myLottoSet) { + int matchCount = countNumberOfLottoMatches(myLottoOneSet, winnerLotto); + boolean isBonusMatch = myLottoOneSet.getNumbers().contains(bonusNumber); + if (matchCount == 3) { + threeMatchCount++; + continue; + } + if (matchCount == 4) { + fourMatchCount++; + continue; + } + if (matchCount == 5) { + if (isBonusMatch) { + fiveAndBonusMatchCount++; + continue; + } + fiveMatchCount++; + continue; + } + if (matchCount == 6) { + sixMatchCount++; + } + } + return new Score(threeMatchCount, fourMatchCount, + fiveMatchCount, fiveAndBonusMatchCount, sixMatchCount); + } + + private int countNumberOfLottoMatches(Lotto myLottoOneSet, Lotto winnerLotto) { + int matchCount = 0; + for (int number : myLottoOneSet.getNumbers()) { + if (winnerLotto.getNumbers().contains(number)) { + matchCount++; + } + } + return matchCount; + } +} diff --git a/src/main/java/lotto/Message.java b/src/main/java/lotto/Message.java new file mode 100644 index 0000000000..76d44b903b --- /dev/null +++ b/src/main/java/lotto/Message.java @@ -0,0 +1,72 @@ +package lotto; + +import java.text.DecimalFormat; + +public class Message { + public enum Input { + PURCHASE_MONEY("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."), + WINNER_NUMBER("\n๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."), + BONUS_NUMBER("\n๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."); + + private final String inputMessage; + + Input(String message) { + inputMessage = message; + } + + @Override + public String toString() { + return inputMessage; + } + } + + public enum Output { + PURCHASE_QUANTITY("\n%d๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค."), + RESULT_STAT("\n๋‹น์ฒจ ํ†ต๊ณ„\n---"), + RESULT_RATE("์ด ์ˆ˜์ต๋ฅ ์€ %s%%์ž…๋‹ˆ๋‹ค."), + RESULT_CONTENTS(""" + 3๊ฐœ ์ผ์น˜ (%s์›) - %d๊ฐœ + 4๊ฐœ ์ผ์น˜ (%s์›) - %d๊ฐœ + 5๊ฐœ ์ผ์น˜ (%s์›) - %d๊ฐœ + 5๊ฐœ ์ผ์น˜, ๋ณด๋„ˆ์Šค ๋ณผ ์ผ์น˜ (%s์›) - %d๊ฐœ + 6๊ฐœ ์ผ์น˜ (%s์›) - %d๊ฐœ"""); + + private final String outputMessage; + + Output(String message) { + outputMessage = message; + } + + public String toQuantityFormat(int lottoQuantity) { + return String.format(outputMessage, lottoQuantity); + } + + public String toRateFormat(double rate) { + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + String roundedNumber = decimalFormat.format(rate); + return String.format(outputMessage, roundedNumber); + } + + @Override + public String toString() { + return outputMessage; + } + } + + public enum Error { + PURCHASE_AMOUNT("๊ตฌ์ž… ๊ธˆ์•ก์€ ๋กœ๋˜ ํ•œ์žฅ ๊ฐ€๊ฒฉ์˜ ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."), + LOTTO_NUMBER("๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."), + BONUS_NUMBER("์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ํ•œ ๊ฐœ์˜ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + + private final String errorMessage; + + Error(String input) { + this.errorMessage = input; + } + + @Override + public String toString() { + return "[ERROR] " + errorMessage; + } + } +} diff --git a/src/main/java/lotto/Number.java b/src/main/java/lotto/Number.java new file mode 100644 index 0000000000..e28a21cc3a --- /dev/null +++ b/src/main/java/lotto/Number.java @@ -0,0 +1,46 @@ +package lotto; + +import java.text.DecimalFormat; + +public class Number { + public enum Rule { + MIN(1), + MAX(45), + SIZE(6), + PRICE(1000); + + private final int rule; + + Rule(int number) { + this.rule = number; + } + + public int toNumber() { + return rule; + } + } + + public enum Prize { + THREE_MATCH(5000), + FOUR_MATCH(50000), + FIVE_MATCH(1500000), + FIVE_BONUS_MATCH(30000000), + SIX_MATCH(2000000000); + + private final int prize; + + Prize(int number) { + this.prize = number; + } + + public int toNumber() { + return prize; + } + + public String toDecimalFormat() { + DecimalFormat decimalFormat = new DecimalFormat("#,###"); + String formattedNumber = decimalFormat.format(prize); + return formattedNumber; + } + } +} \ No newline at end of file diff --git a/src/main/java/lotto/Score.java b/src/main/java/lotto/Score.java new file mode 100644 index 0000000000..4b49a835f4 --- /dev/null +++ b/src/main/java/lotto/Score.java @@ -0,0 +1,35 @@ +package lotto; + +public class Score { + private final int threeMatchCount, fourMatchCount, + fiveMatchCount, fiveAndBonusMatchCount, sixMatchCount; + + public Score(int threeMatchCount, int fourMatchCount, + int fiveMatchCount, int fiveAndBonusMatchCount, int sixMatchCount) { + this.threeMatchCount = threeMatchCount; + this.fourMatchCount = fourMatchCount; + this.fiveMatchCount = fiveMatchCount; + this.fiveAndBonusMatchCount = fiveAndBonusMatchCount; + this.sixMatchCount = sixMatchCount; + } + + public double calculateRate(int purchaseMoney) { + double money = purchaseMoney; + int totalProfit = threeMatchCount * Number.Prize.THREE_MATCH.toNumber() + + fourMatchCount * Number.Prize.FOUR_MATCH.toNumber() + + fiveMatchCount * Number.Prize.FIVE_MATCH.toNumber() + + fiveAndBonusMatchCount * Number.Prize.FIVE_BONUS_MATCH.toNumber() + + sixMatchCount * Number.Prize.SIX_MATCH.toNumber(); + return (totalProfit / money) * 100.0; + } + + @Override + public String toString() { + return String.format(Message.Output.RESULT_CONTENTS.toString(), + Number.Prize.THREE_MATCH.toDecimalFormat(), threeMatchCount, + Number.Prize.FOUR_MATCH.toDecimalFormat(), fourMatchCount, + Number.Prize.FIVE_MATCH.toDecimalFormat(), fiveMatchCount, + Number.Prize.FIVE_BONUS_MATCH.toDecimalFormat(), fiveAndBonusMatchCount, + Number.Prize.SIX_MATCH.toDecimalFormat(), sixMatchCount); + } +}