oh-my-oop 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/MCP_STRUCTURE.md +301 -0
  2. package/README.md +167 -0
  3. package/SCOPE.md +27 -0
  4. package/dist/application/discovery.d.ts +133 -0
  5. package/dist/application/discovery.js +62 -0
  6. package/dist/application/discovery.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +80 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +16 -0
  11. package/dist/config.js +32 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/domain/collaborators.d.ts +2 -0
  14. package/dist/domain/collaborators.js +26 -0
  15. package/dist/domain/collaborators.js.map +1 -0
  16. package/dist/domain/ids.d.ts +4 -0
  17. package/dist/domain/ids.js +23 -0
  18. package/dist/domain/ids.js.map +1 -0
  19. package/dist/domain/model.d.ts +71 -0
  20. package/dist/domain/model.js +2 -0
  21. package/dist/domain/model.js.map +1 -0
  22. package/dist/domain/schemas.d.ts +213 -0
  23. package/dist/domain/schemas.js +79 -0
  24. package/dist/domain/schemas.js.map +1 -0
  25. package/dist/domain/stereotypes.d.ts +7 -0
  26. package/dist/domain/stereotypes.js +65 -0
  27. package/dist/domain/stereotypes.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +21 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/io/classStore.d.ts +9 -0
  32. package/dist/io/classStore.js +39 -0
  33. package/dist/io/classStore.js.map +1 -0
  34. package/dist/io/collaborationStore.d.ts +7 -0
  35. package/dist/io/collaborationStore.js +32 -0
  36. package/dist/io/collaborationStore.js.map +1 -0
  37. package/dist/io/design.d.ts +3 -0
  38. package/dist/io/design.js +22 -0
  39. package/dist/io/design.js.map +1 -0
  40. package/dist/io/designIndex.d.ts +6 -0
  41. package/dist/io/designIndex.js +49 -0
  42. package/dist/io/designIndex.js.map +1 -0
  43. package/dist/io/frontmatter.d.ts +8 -0
  44. package/dist/io/frontmatter.js +31 -0
  45. package/dist/io/frontmatter.js.map +1 -0
  46. package/dist/io/history.d.ts +10 -0
  47. package/dist/io/history.js +38 -0
  48. package/dist/io/history.js.map +1 -0
  49. package/dist/io/useCaseStore.d.ts +8 -0
  50. package/dist/io/useCaseStore.js +36 -0
  51. package/dist/io/useCaseStore.js.map +1 -0
  52. package/dist/io/workspace.d.ts +14 -0
  53. package/dist/io/workspace.js +82 -0
  54. package/dist/io/workspace.js.map +1 -0
  55. package/dist/oop/commands.d.ts +446 -0
  56. package/dist/oop/commands.js +319 -0
  57. package/dist/oop/commands.js.map +1 -0
  58. package/dist/oop/conformance.d.ts +16 -0
  59. package/dist/oop/conformance.js +30 -0
  60. package/dist/oop/conformance.js.map +1 -0
  61. package/dist/prompts/discovery.d.ts +2 -0
  62. package/dist/prompts/discovery.js +41 -0
  63. package/dist/prompts/discovery.js.map +1 -0
  64. package/dist/prompts/imagineWithoutController.d.ts +2 -0
  65. package/dist/prompts/imagineWithoutController.js +75 -0
  66. package/dist/prompts/imagineWithoutController.js.map +1 -0
  67. package/dist/prompts/index.d.ts +2 -0
  68. package/dist/prompts/index.js +17 -0
  69. package/dist/prompts/index.js.map +1 -0
  70. package/dist/prompts/phasePressureTest.d.ts +2 -0
  71. package/dist/prompts/phasePressureTest.js +69 -0
  72. package/dist/prompts/phasePressureTest.js.map +1 -0
  73. package/dist/prompts/rddIntro.d.ts +2 -0
  74. package/dist/prompts/rddIntro.js +53 -0
  75. package/dist/prompts/rddIntro.js.map +1 -0
  76. package/dist/prompts/review.d.ts +2 -0
  77. package/dist/prompts/review.js +45 -0
  78. package/dist/prompts/review.js.map +1 -0
  79. package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
  80. package/dist/prompts/stateMachineIntrospect.js +80 -0
  81. package/dist/prompts/stateMachineIntrospect.js.map +1 -0
  82. package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
  83. package/dist/prompts/tellDontAskRephrase.js +66 -0
  84. package/dist/prompts/tellDontAskRephrase.js.map +1 -0
  85. package/dist/render/diff.d.ts +21 -0
  86. package/dist/render/diff.js +84 -0
  87. package/dist/render/diff.js.map +1 -0
  88. package/dist/render/mermaid.d.ts +24 -0
  89. package/dist/render/mermaid.js +53 -0
  90. package/dist/render/mermaid.js.map +1 -0
  91. package/dist/render/sideBySide.d.ts +14 -0
  92. package/dist/render/sideBySide.js +91 -0
  93. package/dist/render/sideBySide.js.map +1 -0
  94. package/dist/resources/index.d.ts +2 -0
  95. package/dist/resources/index.js +349 -0
  96. package/dist/resources/index.js.map +1 -0
  97. package/dist/server.d.ts +2 -0
  98. package/dist/server.js +22 -0
  99. package/dist/server.js.map +1 -0
  100. package/dist/tools/alternatives.d.ts +2 -0
  101. package/dist/tools/alternatives.js +9 -0
  102. package/dist/tools/alternatives.js.map +1 -0
  103. package/dist/tools/classes.d.ts +2 -0
  104. package/dist/tools/classes.js +13 -0
  105. package/dist/tools/classes.js.map +1 -0
  106. package/dist/tools/collaborations.d.ts +2 -0
  107. package/dist/tools/collaborations.js +8 -0
  108. package/dist/tools/collaborations.js.map +1 -0
  109. package/dist/tools/compare.d.ts +2 -0
  110. package/dist/tools/compare.js +9 -0
  111. package/dist/tools/compare.js.map +1 -0
  112. package/dist/tools/conformance.d.ts +3 -0
  113. package/dist/tools/conformance.js +11 -0
  114. package/dist/tools/conformance.js.map +1 -0
  115. package/dist/tools/diagram.d.ts +2 -0
  116. package/dist/tools/diagram.js +9 -0
  117. package/dist/tools/diagram.js.map +1 -0
  118. package/dist/tools/discovery.d.ts +2 -0
  119. package/dist/tools/discovery.js +23 -0
  120. package/dist/tools/discovery.js.map +1 -0
  121. package/dist/tools/index.d.ts +2 -0
  122. package/dist/tools/index.js +27 -0
  123. package/dist/tools/index.js.map +1 -0
  124. package/dist/tools/init.d.ts +2 -0
  125. package/dist/tools/init.js +9 -0
  126. package/dist/tools/init.js.map +1 -0
  127. package/dist/tools/oop.d.ts +9 -0
  128. package/dist/tools/oop.js +26 -0
  129. package/dist/tools/oop.js.map +1 -0
  130. package/dist/tools/responsibilities.d.ts +2 -0
  131. package/dist/tools/responsibilities.js +13 -0
  132. package/dist/tools/responsibilities.js.map +1 -0
  133. package/dist/tools/state.d.ts +2 -0
  134. package/dist/tools/state.js +8 -0
  135. package/dist/tools/state.js.map +1 -0
  136. package/dist/tools/useCases.d.ts +2 -0
  137. package/dist/tools/useCases.js +18 -0
  138. package/dist/tools/useCases.js.map +1 -0
  139. package/dist/tools/validate.d.ts +2 -0
  140. package/dist/tools/validate.js +9 -0
  141. package/dist/tools/validate.js.map +1 -0
  142. package/dist/tradeoff/engine.d.ts +61 -0
  143. package/dist/tradeoff/engine.js +171 -0
  144. package/dist/tradeoff/engine.js.map +1 -0
  145. package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
  146. package/dist/tradeoff/heuristics/classSplit.js +94 -0
  147. package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
  148. package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
  149. package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
  150. package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
  151. package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
  152. package/dist/tradeoff/heuristics/collectionShape.js +113 -0
  153. package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
  154. package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
  155. package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
  156. package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
  157. package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
  158. package/dist/tradeoff/heuristics/errorHandling.js +110 -0
  159. package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
  160. package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
  161. package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
  162. package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
  163. package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
  164. package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
  165. package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
  166. package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
  167. package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
  168. package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
  169. package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
  170. package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
  171. package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
  172. package/dist/tradeoff/templates.d.ts +2 -0
  173. package/dist/tradeoff/templates.js +33 -0
  174. package/dist/tradeoff/templates.js.map +1 -0
  175. package/dist/util/log.d.ts +1 -0
  176. package/dist/util/log.js +7 -0
  177. package/dist/util/log.js.map +1 -0
  178. package/dist/util/mcp.d.ts +4 -0
  179. package/dist/util/mcp.js +18 -0
  180. package/dist/util/mcp.js.map +1 -0
  181. package/dist/validate/cohesion.d.ts +3 -0
  182. package/dist/validate/cohesion.js +88 -0
  183. package/dist/validate/cohesion.js.map +1 -0
  184. package/dist/validate/collectionWrapper.d.ts +3 -0
  185. package/dist/validate/collectionWrapper.js +131 -0
  186. package/dist/validate/collectionWrapper.js.map +1 -0
  187. package/dist/validate/coupling.d.ts +3 -0
  188. package/dist/validate/coupling.js +47 -0
  189. package/dist/validate/coupling.js.map +1 -0
  190. package/dist/validate/cycle.d.ts +3 -0
  191. package/dist/validate/cycle.js +101 -0
  192. package/dist/validate/cycle.js.map +1 -0
  193. package/dist/validate/dataDuplication.d.ts +3 -0
  194. package/dist/validate/dataDuplication.js +150 -0
  195. package/dist/validate/dataDuplication.js.map +1 -0
  196. package/dist/validate/dependencyDirection.d.ts +3 -0
  197. package/dist/validate/dependencyDirection.js +106 -0
  198. package/dist/validate/dependencyDirection.js.map +1 -0
  199. package/dist/validate/dualUseKnowing.d.ts +3 -0
  200. package/dist/validate/dualUseKnowing.js +137 -0
  201. package/dist/validate/dualUseKnowing.js.map +1 -0
  202. package/dist/validate/emptyObjectFill.d.ts +3 -0
  203. package/dist/validate/emptyObjectFill.js +119 -0
  204. package/dist/validate/emptyObjectFill.js.map +1 -0
  205. package/dist/validate/findings.d.ts +22 -0
  206. package/dist/validate/findings.js +12 -0
  207. package/dist/validate/findings.js.map +1 -0
  208. package/dist/validate/functionDecompositionExcess.d.ts +3 -0
  209. package/dist/validate/functionDecompositionExcess.js +120 -0
  210. package/dist/validate/functionDecompositionExcess.js.map +1 -0
  211. package/dist/validate/functionNotObject.d.ts +3 -0
  212. package/dist/validate/functionNotObject.js +80 -0
  213. package/dist/validate/functionNotObject.js.map +1 -0
  214. package/dist/validate/godObject.d.ts +6 -0
  215. package/dist/validate/godObject.js +76 -0
  216. package/dist/validate/godObject.js.map +1 -0
  217. package/dist/validate/presentationInDomain.d.ts +3 -0
  218. package/dist/validate/presentationInDomain.js +57 -0
  219. package/dist/validate/presentationInDomain.js.map +1 -0
  220. package/dist/validate/primitiveWrapper.d.ts +3 -0
  221. package/dist/validate/primitiveWrapper.js +106 -0
  222. package/dist/validate/primitiveWrapper.js.map +1 -0
  223. package/dist/validate/rules.d.ts +24 -0
  224. package/dist/validate/rules.js +269 -0
  225. package/dist/validate/rules.js.map +1 -0
  226. package/dist/validate/singletonStatefulHolder.d.ts +3 -0
  227. package/dist/validate/singletonStatefulHolder.js +128 -0
  228. package/dist/validate/singletonStatefulHolder.js.map +1 -0
  229. package/dist/validate/strategyAsymmetry.d.ts +3 -0
  230. package/dist/validate/strategyAsymmetry.js +131 -0
  231. package/dist/validate/strategyAsymmetry.js.map +1 -0
  232. package/dist/validate/testability.d.ts +5 -0
  233. package/dist/validate/testability.js +157 -0
  234. package/dist/validate/testability.js.map +1 -0
  235. package/dist/validate/vagueName.d.ts +3 -0
  236. package/dist/validate/vagueName.js +136 -0
  237. package/dist/validate/vagueName.js.map +1 -0
  238. package/dist/validate/validationLocation.d.ts +3 -0
  239. package/dist/validate/validationLocation.js +120 -0
  240. package/dist/validate/validationLocation.js.map +1 -0
  241. package/lessons/STYLE_GUIDE.md +304 -0
  242. package/lessons/woowacourse-kotlin-blackjack/2chang5/33-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +293 -0
  243. package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/52-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +106 -0
  244. package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/9-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
  245. package/lessons/woowacourse-kotlin-blackjack/DYGames/14-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +182 -0
  246. package/lessons/woowacourse-kotlin-blackjack/DYGames/37-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +122 -0
  247. package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/12-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +117 -0
  248. package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/38-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +291 -0
  249. package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
  250. package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/119-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +251 -0
  251. package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/137-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +459 -0
  252. package/lessons/woowacourse-kotlin-blackjack/Hevton/100-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
  253. package/lessons/woowacourse-kotlin-blackjack/Hevton/82-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +303 -0
  254. package/lessons/woowacourse-kotlin-blackjack/Hogu59/71-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +134 -0
  255. package/lessons/woowacourse-kotlin-blackjack/Hogu59/96-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +323 -0
  256. package/lessons/woowacourse-kotlin-blackjack/JoYehyun99/66-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +210 -0
  257. package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/101-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +191 -0
  258. package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/80-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
  259. package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/108-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +516 -0
  260. package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/133-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +541 -0
  261. package/lessons/woowacourse-kotlin-blackjack/RightHennessy/22-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
  262. package/lessons/woowacourse-kotlin-blackjack/RightHennessy/48-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
  263. package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/16-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +228 -0
  264. package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/54-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +227 -0
  265. package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/76-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
  266. package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +203 -0
  267. package/lessons/woowacourse-kotlin-blackjack/aprilgom/105-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +162 -0
  268. package/lessons/woowacourse-kotlin-blackjack/aprilgom/64-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
  269. package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/18-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
  270. package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/36-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +769 -0
  271. package/lessons/woowacourse-kotlin-blackjack/briandr97/19-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +226 -0
  272. package/lessons/woowacourse-kotlin-blackjack/briandr97/59-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +193 -0
  273. package/lessons/woowacourse-kotlin-blackjack/chaehyuns/70-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
  274. package/lessons/woowacourse-kotlin-blackjack/chaehyuns/98-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
  275. package/lessons/woowacourse-kotlin-blackjack/chanho0908/123-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +277 -0
  276. package/lessons/woowacourse-kotlin-blackjack/chanho0908/150-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
  277. package/lessons/woowacourse-kotlin-blackjack/chws0508/26-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +259 -0
  278. package/lessons/woowacourse-kotlin-blackjack/chws0508/43-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +189 -0
  279. package/lessons/woowacourse-kotlin-blackjack/cucumber99/109-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +351 -0
  280. package/lessons/woowacourse-kotlin-blackjack/cucumber99/149-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +147 -0
  281. package/lessons/woowacourse-kotlin-blackjack/devfeijoa/121-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +168 -0
  282. package/lessons/woowacourse-kotlin-blackjack/devfeijoa/153-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +116 -0
  283. package/lessons/woowacourse-kotlin-blackjack/doabletuple/126-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +680 -0
  284. package/lessons/woowacourse-kotlin-blackjack/doabletuple/142-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +739 -0
  285. package/lessons/woowacourse-kotlin-blackjack/donghyun81/116-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
  286. package/lessons/woowacourse-kotlin-blackjack/donghyun81/147-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +244 -0
  287. package/lessons/woowacourse-kotlin-blackjack/dpcks0509/78-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +232 -0
  288. package/lessons/woowacourse-kotlin-blackjack/dpcks0509/88-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +137 -0
  289. package/lessons/woowacourse-kotlin-blackjack/etama123/112-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
  290. package/lessons/woowacourse-kotlin-blackjack/etama123/148-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +240 -0
  291. package/lessons/woowacourse-kotlin-blackjack/gaeun5744/102-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +146 -0
  292. package/lessons/woowacourse-kotlin-blackjack/gaeun5744/69-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
  293. package/lessons/woowacourse-kotlin-blackjack/gahyunkim/118-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +397 -0
  294. package/lessons/woowacourse-kotlin-blackjack/gahyunkim/141-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +215 -0
  295. package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/106-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +395 -0
  296. package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/134-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
  297. package/lessons/woowacourse-kotlin-blackjack/haeum808/62-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +230 -0
  298. package/lessons/woowacourse-kotlin-blackjack/haeum808/89-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +169 -0
  299. package/lessons/woowacourse-kotlin-blackjack/hwannow/110-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
  300. package/lessons/woowacourse-kotlin-blackjack/hwannow/132-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +573 -0
  301. package/lessons/woowacourse-kotlin-blackjack/hxeyexn/103-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
  302. package/lessons/woowacourse-kotlin-blackjack/hxeyexn/81-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +301 -0
  303. package/lessons/woowacourse-kotlin-blackjack/hyemdooly/21-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +613 -0
  304. package/lessons/woowacourse-kotlin-blackjack/hyemdooly/35-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +691 -0
  305. package/lessons/woowacourse-kotlin-blackjack/hyunji1203/13-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
  306. package/lessons/woowacourse-kotlin-blackjack/ii2001/79-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +153 -0
  307. package/lessons/woowacourse-kotlin-blackjack/ii2001/85-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +318 -0
  308. package/lessons/woowacourse-kotlin-blackjack/ijh1298/128-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
  309. package/lessons/woowacourse-kotlin-blackjack/ijh1298/135-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
  310. package/lessons/woowacourse-kotlin-blackjack/inseonyun/28-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +346 -0
  311. package/lessons/woowacourse-kotlin-blackjack/inseonyun/49-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +360 -0
  312. package/lessons/woowacourse-kotlin-blackjack/ippnsj/30-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +152 -0
  313. package/lessons/woowacourse-kotlin-blackjack/ippnsj/42-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +213 -0
  314. package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/73-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +247 -0
  315. package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/87-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +900 -0
  316. package/lessons/woowacourse-kotlin-blackjack/jerry8282/125-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +248 -0
  317. package/lessons/woowacourse-kotlin-blackjack/jerry8282/151-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +243 -0
  318. package/lessons/woowacourse-kotlin-blackjack/jinuemong/63-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +281 -0
  319. package/lessons/woowacourse-kotlin-blackjack/jinuemong/92-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +283 -0
  320. package/lessons/woowacourse-kotlin-blackjack/jiyuneel/113-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +348 -0
  321. package/lessons/woowacourse-kotlin-blackjack/jiyuneel/140-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
  322. package/lessons/woowacourse-kotlin-blackjack/junjange/61-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +270 -0
  323. package/lessons/woowacourse-kotlin-blackjack/junjange/93-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +465 -0
  324. package/lessons/woowacourse-kotlin-blackjack/junseo511/107-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +296 -0
  325. package/lessons/woowacourse-kotlin-blackjack/junseo511/145-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +316 -0
  326. package/lessons/woowacourse-kotlin-blackjack/ki960213/11-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
  327. package/lessons/woowacourse-kotlin-blackjack/kimhm0728/72-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +458 -0
  328. package/lessons/woowacourse-kotlin-blackjack/kimhm0728/97-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +225 -0
  329. package/lessons/woowacourse-kotlin-blackjack/kkosang/68-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
  330. package/lessons/woowacourse-kotlin-blackjack/kkosang/94-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +158 -0
  331. package/lessons/woowacourse-kotlin-blackjack/kmkim2689/65-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +252 -0
  332. package/lessons/woowacourse-kotlin-blackjack/kmkim2689/90-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +460 -0
  333. package/lessons/woowacourse-kotlin-blackjack/krrong/32-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
  334. package/lessons/woowacourse-kotlin-blackjack/krrong/46-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +285 -0
  335. package/lessons/woowacourse-kotlin-blackjack/m6z1/122-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +177 -0
  336. package/lessons/woowacourse-kotlin-blackjack/m6z1/144-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +155 -0
  337. package/lessons/woowacourse-kotlin-blackjack/medAndro/130-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
  338. package/lessons/woowacourse-kotlin-blackjack/medAndro/143-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +678 -0
  339. package/lessons/woowacourse-kotlin-blackjack/moondev03/114-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +262 -0
  340. package/lessons/woowacourse-kotlin-blackjack/moondev03/131-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +498 -0
  341. package/lessons/woowacourse-kotlin-blackjack/murjune/77-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +287 -0
  342. package/lessons/woowacourse-kotlin-blackjack/murjune/91-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +280 -0
  343. package/lessons/woowacourse-kotlin-blackjack/no1msh/31-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
  344. package/lessons/woowacourse-kotlin-blackjack/otter66/24-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +302 -0
  345. package/lessons/woowacourse-kotlin-blackjack/otter66/58-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +391 -0
  346. package/lessons/woowacourse-kotlin-blackjack/oungsi2000/111-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
  347. package/lessons/woowacourse-kotlin-blackjack/oungsi2000/136-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +540 -0
  348. package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/117-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +819 -0
  349. package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/139-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
  350. package/lessons/woowacourse-kotlin-blackjack/pingu244/20-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +258 -0
  351. package/lessons/woowacourse-kotlin-blackjack/pingu244/41-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +171 -0
  352. package/lessons/woowacourse-kotlin-blackjack/re4rk/34-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +289 -0
  353. package/lessons/woowacourse-kotlin-blackjack/re4rk/8-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
  354. package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/17-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
  355. package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/50-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +145 -0
  356. package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/23-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
  357. package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/39-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
  358. package/lessons/woowacourse-kotlin-blackjack/rosemin928/129-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +726 -0
  359. package/lessons/woowacourse-kotlin-blackjack/rosemin928/138-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +845 -0
  360. package/lessons/woowacourse-kotlin-blackjack/s6m1n/67-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +220 -0
  361. package/lessons/woowacourse-kotlin-blackjack/s6m1n/99-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +229 -0
  362. package/lessons/woowacourse-kotlin-blackjack/s9hn/10-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +284 -0
  363. package/lessons/woowacourse-kotlin-blackjack/sh1mj1/75-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
  364. package/lessons/woowacourse-kotlin-blackjack/songpink/74-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
  365. package/lessons/woowacourse-kotlin-blackjack/songpink/95-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
  366. package/lessons/woowacourse-kotlin-blackjack/sujin9/15-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +132 -0
  367. package/lessons/woowacourse-kotlin-blackjack/sujin9/47-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
  368. package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/29-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
  369. package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/51-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
  370. package/lessons/woowacourse-kotlin-blackjack/tobae-time/115-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
  371. package/lessons/woowacourse-kotlin-blackjack/tobae-time/154-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +298 -0
  372. package/lessons/woowacourse-kotlin-blackjack/whk06061/25-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +235 -0
  373. package/lessons/woowacourse-kotlin-blackjack/whk06061/53-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +130 -0
  374. package/lessons/woowacourse-kotlin-blackjack/wondroid-world/124-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +486 -0
  375. package/lessons/woowacourse-kotlin-blackjack/wondroid-world/152-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +482 -0
  376. package/lessons/woowacourse-kotlin-blackjack/yrsel/120-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +194 -0
  377. package/lessons/woowacourse-kotlin-blackjack/yrsel/146-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +444 -0
  378. package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  379. package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
  380. package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
  381. package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
  382. package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
  383. package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
  384. package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  385. package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
  386. package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
  387. package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  388. package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
  389. package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  390. package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
  391. package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
  392. package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
  393. package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
  394. package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
  395. package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  396. package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
  397. package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
  398. package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
  399. package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
  400. package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
  401. package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  402. package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  403. package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
  404. package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  405. package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
  406. package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
  407. package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
  408. package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
  409. package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
  410. package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  411. package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  412. package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  413. package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
  414. package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
  415. package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  416. package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
  417. package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  418. package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
  419. package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
  420. package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  421. package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
  422. package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
  423. package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
  424. package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
  425. package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
  426. package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
  427. package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  428. package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
  429. package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
  430. package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
  431. package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
  432. package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  433. package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
  434. package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
  435. package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
  436. package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
  437. package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
  438. package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  439. package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  440. package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
  441. package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  442. package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
  443. package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
  444. package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
  445. package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
  446. package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
  447. package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
  448. package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  449. package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  450. package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
  451. package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
  452. package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
  453. package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
  454. package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
  455. package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  456. package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
  457. package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
  458. package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  459. package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  460. package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
  461. package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
  462. package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
  463. package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
  464. package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
  465. package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  466. package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
  467. package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
  468. package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
  469. package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
  470. package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
  471. package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
  472. package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
  473. package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
  474. package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
  475. package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
  476. package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
  477. package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
  478. package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  479. package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
  480. package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
  481. package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  482. package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
  483. package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  484. package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
  485. package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
  486. package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  487. package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
  488. package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
  489. package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
  490. package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
  491. package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  492. package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
  493. package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  494. package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
  495. package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
  496. package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
  497. package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
  498. package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
  499. package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
  500. package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
  501. package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
  502. package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
  503. package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
  504. package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
  505. package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
  506. package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
  507. package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
  508. package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
  509. package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
  510. package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
  511. package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  512. package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  513. package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
  514. package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
  515. package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
  516. package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
  517. package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
  518. package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
  519. package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
  520. package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
  521. package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
  522. package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
  523. package/lessons/woowacourse-racingcar/2chang5/33-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  524. package/lessons/woowacourse-racingcar/2chang5/75-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  525. package/lessons/woowacourse-racingcar/CFalws/85-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  526. package/lessons/woowacourse-racingcar/Choisehyeon/46-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  527. package/lessons/woowacourse-racingcar/DYGames/49-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
  528. package/lessons/woowacourse-racingcar/EmilyCh0/40-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +64 -0
  529. package/lessons/woowacourse-racingcar/EmilyCh0/57-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  530. package/lessons/woowacourse-racingcar/HamBeomJoon/137-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  531. package/lessons/woowacourse-racingcar/HamBeomJoon/170-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  532. package/lessons/woowacourse-racingcar/Hevton/106-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  533. package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
  534. package/lessons/woowacourse-racingcar/Hogu59/108-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  535. package/lessons/woowacourse-racingcar/Hogu59/125-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  536. package/lessons/woowacourse-racingcar/JoYehyun99/111-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  537. package/lessons/woowacourse-racingcar/JoYehyun99/88-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
  538. package/lessons/woowacourse-racingcar/Junyoung-WON/127-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  539. package/lessons/woowacourse-racingcar/Junyoung-WON/90-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  540. package/lessons/woowacourse-racingcar/Leeyerin0210/133-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  541. package/lessons/woowacourse-racingcar/Leeyerin0210/159-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  542. package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
  543. package/lessons/woowacourse-racingcar/README.md +69 -0
  544. package/lessons/woowacourse-racingcar/RightHennessy/51-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  545. package/lessons/woowacourse-racingcar/RightHennessy/58-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  546. package/lessons/woowacourse-racingcar/RunaNam/81-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
  547. package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
  548. package/lessons/woowacourse-racingcar/SeongHoonC/37-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  549. package/lessons/woowacourse-racingcar/SeongHoonC/66-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  550. package/lessons/woowacourse-racingcar/Songusika/84-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  551. package/lessons/woowacourse-racingcar/Yunseok-Nam/114-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  552. package/lessons/woowacourse-racingcar/Yunseok-Nam/96-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  553. package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
  554. package/lessons/woowacourse-racingcar/aprilgom/97-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  555. package/lessons/woowacourse-racingcar/awesomeo184/23-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  556. package/lessons/woowacourse-racingcar/boogi-woogi/35-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
  557. package/lessons/woowacourse-racingcar/boogi-woogi/59-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  558. package/lessons/woowacourse-racingcar/briandr97/54-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  559. package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
  560. package/lessons/woowacourse-racingcar/chaehyuns/99-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  561. package/lessons/woowacourse-racingcar/chanho0908/147-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  562. package/lessons/woowacourse-racingcar/chanho0908/160-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  563. package/lessons/woowacourse-racingcar/chws0508/45-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  564. package/lessons/woowacourse-racingcar/chws0508/73-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
  565. package/lessons/woowacourse-racingcar/cucumber99/132-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  566. package/lessons/woowacourse-racingcar/cucumber99/177-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  567. package/lessons/woowacourse-racingcar/devfeijoa/146-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  568. package/lessons/woowacourse-racingcar/doabletuple/149-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  569. package/lessons/woowacourse-racingcar/doabletuple/175-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  570. package/lessons/woowacourse-racingcar/donghyun81/154-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  571. package/lessons/woowacourse-racingcar/dpcks0509/103-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  572. package/lessons/woowacourse-racingcar/dpcks0509/112-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  573. package/lessons/woowacourse-racingcar/drunkenhw/82-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  574. package/lessons/woowacourse-racingcar/etama123/145-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  575. package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
  576. package/lessons/woowacourse-racingcar/gaeun5744/93-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  577. package/lessons/woowacourse-racingcar/gahyunkim/134-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  578. package/lessons/woowacourse-racingcar/gahyunkim/164-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  579. package/lessons/woowacourse-racingcar/giovannijunseokim/140-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  580. package/lessons/woowacourse-racingcar/haeum808/101-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  581. package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
  582. package/lessons/woowacourse-racingcar/hwannow/141-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  583. package/lessons/woowacourse-racingcar/hwannow/157-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
  584. package/lessons/woowacourse-racingcar/hxeyexn/109-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  585. package/lessons/woowacourse-racingcar/hxeyexn/128-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  586. package/lessons/woowacourse-racingcar/hyemdooly/50-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  587. package/lessons/woowacourse-racingcar/hyemdooly/68-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  588. package/lessons/woowacourse-racingcar/hyunji1203/29-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  589. package/lessons/woowacourse-racingcar/hyunji1203/60-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  590. package/lessons/woowacourse-racingcar/ii2001/102-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
  591. package/lessons/woowacourse-racingcar/ii2001/122-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  592. package/lessons/woowacourse-racingcar/ijh1298/144-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  593. package/lessons/woowacourse-racingcar/injoon2019/24-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  594. package/lessons/woowacourse-racingcar/inseonyun/44-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  595. package/lessons/woowacourse-racingcar/inseonyun/76-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  596. package/lessons/woowacourse-racingcar/ippnsj/36-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  597. package/lessons/woowacourse-racingcar/ippnsj/67-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  598. package/lessons/woowacourse-racingcar/jaeyeongjo/110-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
  599. package/lessons/woowacourse-racingcar/jaeyeongjo/89-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
  600. package/lessons/woowacourse-racingcar/jinuemong/104-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  601. package/lessons/woowacourse-racingcar/jinuemong/117-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
  602. package/lessons/woowacourse-racingcar/jiyuneel/142-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  603. package/lessons/woowacourse-racingcar/junjange/113-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +41 -0
  604. package/lessons/woowacourse-racingcar/junjange/87-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
  605. package/lessons/woowacourse-racingcar/junseo511/148-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  606. package/lessons/woowacourse-racingcar/junseo511/165-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  607. package/lessons/woowacourse-racingcar/ki960213/32-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  608. package/lessons/woowacourse-racingcar/ki960213/63-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  609. package/lessons/woowacourse-racingcar/kimhm0728/100-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  610. package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
  611. package/lessons/woowacourse-racingcar/kkosang/105-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  612. package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
  613. package/lessons/woowacourse-racingcar/kmkim2689/123-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  614. package/lessons/woowacourse-racingcar/kmkim2689/92-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  615. package/lessons/woowacourse-racingcar/krrong/34-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +63 -0
  616. package/lessons/woowacourse-racingcar/m6z1/150-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  617. package/lessons/woowacourse-racingcar/m6z1/156-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +40 -0
  618. package/lessons/woowacourse-racingcar/medAndro/153-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  619. package/lessons/woowacourse-racingcar/moondev03/135-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
  620. package/lessons/woowacourse-racingcar/moondev03/161-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  621. package/lessons/woowacourse-racingcar/murjune/121-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  622. package/lessons/woowacourse-racingcar/murjune/95-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  623. package/lessons/woowacourse-racingcar/no1msh/43-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  624. package/lessons/woowacourse-racingcar/no1msh/69-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  625. package/lessons/woowacourse-racingcar/otter66/48-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  626. package/lessons/woowacourse-racingcar/otter66/77-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
  627. package/lessons/woowacourse-racingcar/oungsi2000/152-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
  628. package/lessons/woowacourse-racingcar/oungsi2000/187-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  629. package/lessons/woowacourse-racingcar/parkjiminnnn/143-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  630. package/lessons/woowacourse-racingcar/parkjiminnnn/158-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  631. package/lessons/woowacourse-racingcar/pingu244/38-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  632. package/lessons/woowacourse-racingcar/pingu244/62-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  633. package/lessons/woowacourse-racingcar/re4rk/28-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
  634. package/lessons/woowacourse-racingcar/re4rk/55-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  635. package/lessons/woowacourse-racingcar/rhkrwngud445/42-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  636. package/lessons/woowacourse-racingcar/rhkrwngud445/74-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
  637. package/lessons/woowacourse-racingcar/rhthrhrl0/31-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  638. package/lessons/woowacourse-racingcar/rosemin928/138-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  639. package/lessons/woowacourse-racingcar/rosemin928/171-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +38 -0
  640. package/lessons/woowacourse-racingcar/s6m1n/120-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
  641. package/lessons/woowacourse-racingcar/s6m1n/91-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
  642. package/lessons/woowacourse-racingcar/s9hn/53-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
  643. package/lessons/woowacourse-racingcar/s9hn/78-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  644. package/lessons/woowacourse-racingcar/sh1mj1/107-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  645. package/lessons/woowacourse-racingcar/sh1mj1/115-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
  646. package/lessons/woowacourse-racingcar/songpink/119-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  647. package/lessons/woowacourse-racingcar/songpink/98-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
  648. package/lessons/woowacourse-racingcar/sujin9/52-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
  649. package/lessons/woowacourse-racingcar/sujin9/61-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
  650. package/lessons/woowacourse-racingcar/tmdgh1592/47-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  651. package/lessons/woowacourse-racingcar/tmdgh1592/64-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  652. package/lessons/woowacourse-racingcar/tobae-time/151-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
  653. package/lessons/woowacourse-racingcar/tobae-time/167-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
  654. package/lessons/woowacourse-racingcar/whk06061/41-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
  655. package/lessons/woowacourse-racingcar/wondroid-world/136-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
  656. package/lessons/woowacourse-racingcar/wondroid-world/166-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
  657. package/lessons/woowacourse-racingcar/yrsel/139-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
  658. package/lessons/woowacourse-racingcar/yujamint/83-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
  659. package/package.json +46 -0
  660. package/skills/oh-my-oop/SKILL.md +39 -0
@@ -0,0 +1,188 @@
1
+ # PR #103 — [블랙잭 2단계] 해나 미션
2
+
3
+ - **Reviewee:** [@hxeyexn](https://github.com/hxeyexn)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/103
5
+ - **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
6
+ - **리뷰어:** @laco-dev (페로로)
7
+ - **라인 코멘트:** 10 스레드 / 20 코멘트 — 짧은 PR + 핵심 안티패턴 진단 다수
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **플레이어 + 베팅 금액 동시 입력 자가 반영** — 페로로의 *"플레이어를 준비하면서 배팅 금액을 입력받을 수 있지 않을까요?"* 진단 자가 반영 (커밋 `14775ee`). PR #85·#88·#90 와 같은 결.
12
+ - **딜러 16점 룰 명시 자가 반영** — 페로로의 *"딜러도 16점 이하라면, 16점을 넘을 때 까지 계속해서 뽑아야 합니다."* 진단 자가 반영 (커밋 `55d2dcf`). 1단계 룰 보강.
13
+ - **딜러 베팅 금액 제거 자가 반영** — 페로로의 *"배팅 금액은 플레이어에게만 있는 개념이 아닐까요? 딜러의 입장에서는, 배팅을 하지 않으니까요"* 진단 자가 반영 (커밋 `a69ea03`). *Dealer ≠ Player 도메인 구분 명시*. PR #103 (해나) 의 *Player(name, betAmount) vs Dealer(name)* 비대칭 정공. PR #133·#85·#136 와 같은 결.
14
+ - **수익률 계산 책임 = `FinalWinning`** 자가 결정 — 페로로 메타 질문 *"수익률은, 게임 결과인 FinalWinning이 계산하는 것과 Participants가 계산하는 것 중 누가 하는 것이 적절하다고 생각하시나요?"* 에 학생 자가 답변: *"FinalWinning이 좀 더 적절한 것 같습니다! Participants와 FinalWinning 중 고민 했었는 데 FinalWinning으로 수익률을 계산하는 것을 옮겨보니 코드가 간결해졌다는 걸 느꼈습니다."* (커밋 `2253b73`). **자가 결정 + 근거 명시 모범**.
15
+ - **상태 패턴 도입 자가 학습 (CardHand 분리)** — 페로로의 *"플레이어는 스테이 상태를 선언하면, 카드를 더 이상 뽑을 수 없어요. 이 개념을 구현 해보시면 좋을 것 같습니다."* + 1단계 코멘트 인용 *"플레이어와 딜러가 카드 상태랑 강하게 결합되어 있다 ... 플레이어가 스테이가 될 수 있다는 상태가 고려한다면 도움이 좀 될 것 같습니다."* 후속 반영 (커밋 `e0f3ef7`). *학생 자가 인용으로 1단계 진단 의식 명시*.
16
+ - **Bust 양측 처리 + 딜러 Bust 룰 자가 반영** — 페로로의 *"내가 버스트라면 상대의 패와 상관없이 무조건 패배합니다."* 진단 학생 자가 정리: *"- 플레이어가 Bust라면 딜러의 패와 상관없이 무조건 패. - 딜러가 Bust이고, 플레이어가 Bust가 아니라면 딜러 패"* 룰 추가 (커밋 `68dd994`). **블랙잭 룰 정확성 자가 학습 모범**. PR #128·#135·#114·#136 와 같은 결.
17
+ - **`calculatePlayerProfit` MutableMap 인자 제거 자가 반영** — 페로로 진단 *"메서드를 분리하는 과정에서 놓친 것 같습니다. profit 파라미터 삭제하였습니다!"* (커밋 `4503d84`). *불필요한 가변 인자 제거*.
18
+ - **`CardFixture` 활용 + 꼼꼼한 테스트** — 페로로 자가 칭찬 다수 (Fixture 좋습니다 + 꼼꼼한 테스트 좋았습니다).
19
+
20
+ ## 못한 점 (설계 관점)
21
+
22
+ ### 1. `RandomDeck` 의 `_cardDeck` + `cardDeck` 이중 표현 — *불필요한 중복*
23
+
24
+ 학생 코드 (추정):
25
+ ```kotlin
26
+ class RandomDeck {
27
+ private val _cardDeck: List<Card> = ...
28
+ private val cardDeck: List<Card> = ...
29
+ }
30
+ ```
31
+
32
+ 페로로 (RandomDeck.kt:6 — 미해결): *"이 두개의 카드덱은 어떤 차이가 있나요?"*
33
+
34
+ 학생: *"_cardDeck에는 실제 카드 덱을 저장하고, cardDeck을 이용해 클래스 외부에서는 카드 덱 데이터를 읽을 수는 있지만, 직접 수정할 수는 없게 하려고 했었습니다. 리팩터링 하다보니 cardDeck을 외부에서 사용할 때가 없어졌는 데 추후에 사용할 일이 있을까봐 일단은 private으로 설정해뒀습니다! 혹시 제가 잘못 이해하고 있는 부분이 있을까요..?"*
35
+
36
+ 페로로 후속: *"둘 다 모두 `List<Card>` 타입이고, 따로 두개가 나뉘어진 이유가 모르겠네요!?"*
37
+
38
+ → **`_cardDeck` (private) + `cardDeck` (private) 이중 표현 = *불필요한 중복***. *Kotlin backing field 패턴 = `private val _x + val x: get() = _x.toList()`*. *둘 다 `List<Card>`* 면 *backing field 아닌 단순 중복*. *YAGNI 위반*. PR #88 (채드) 의 *부 생성자 미사용 자가 삭제* 와 같은 결.
39
+
40
+ 학생 자가 답변에서 *"추후에 사용할 일이 있을까봐 일단은 private으로 설정해뒀습니다"* = **추측 코딩 신호** — *현재 사용처에서 시작 + 필요 시 추가* 정공.
41
+
42
+ ### 2. `CardHand` *카드 + 상태 결합 강도* — 1단계 진단의 일부 후속 반영
43
+
44
+ 페로로 (CardHand.kt:31 — 미해결): *"플레이어는 스테이 상태를 선언하면, 카드를 더 이상 뽑을 수 없어요. 이 개념을 구현 해보시면 좋을 것 같습니다."*
45
+
46
+ 학생 자가 답변: *"> 지난번 플레이어와 딜러가 카드 상태랑 강하게 결합되어 있다는 말을 드렸는데, > 플레이어가 스테이가 될 수 있다는 상태가 고려한다면 도움이 좀 될 것 같습니다. 이와 관련해 step1에서 남겨 주신 조언 참고해서 피드백 반영해보았습니다!"* (커밋 `e0f3ef7`).
47
+
48
+ → **1단계 진단 인용 = 학습 모범**. *학생이 1단계 페로로 코멘트 직접 인용 + 의식적 반영*. PR #128·#135·#108·#133·#136 와 같은 결의 *진단 인식 + 후속 반영*.
49
+
50
+ 다만 *상태 분리 결과 코드는 미공개* — *Hand 자체에 stay boolean / sealed state / enum* 등 표현 방식이 *PR #85·#136·#152·#133·#131* 의 다양한 트레이드오프 중 어느 것인지 확인 불가.
51
+
52
+ ### 3. `Participants.calculatePlayerProfit(MutableMap)` 인자 — *부수효과 메서드 시그니처*
53
+
54
+ 페로로 (Participants.kt — 미해결): *"calculatePlayerProfit() 라는 함수 이름으로만 보면, 수익률을 반환하는 역할을 잘 수행하고 있어요. 그런데 MutableMap을 굳이 파라미터로 넣어줄 필요가 있는 것일까요?"*
55
+
56
+ 학생 자가 답변 (커밋 `4503d84`): *"메서드를 분리하는 과정에서 놓친 것 같습니다. profit 파라미터 삭제하였습니다!"*
57
+
58
+ → **MutableMap 인자 = 부수효과 메서드 시그니처**. *calculateXXX 가 반환 + 외부 가변 Map 변경* 동시 책임. *PR #85 (하디 2단계) 의 페로로 calculateFinalProfits Unit 반환 진단* 과 같은 결. *학생 자가 후퇴 모범*.
59
+
60
+ ### 4. *`is Bust` 의 *상대 패와 무관하게 패배* 룰 누락 (자가 수정 전)*
61
+
62
+ 페로로 (Role.kt — 미해결, 자가 반영 후): *"내가 버스트라면 상대의 패와 상관없이 무조건 패배합니다."*
63
+
64
+ 학생 자가 정리:
65
+ ```
66
+ - 플레이어가 Bust라면 딜러의 패와 상관없이 무조건 패
67
+ - 딜러가 Bust이고, 플레이어가 Bust가 아니라면 딜러 패
68
+ ```
69
+
70
+ (커밋 `68dd994`).
71
+
72
+ → **블랙잭 룰 정확성 = Bust 우선순위 + 비대칭**. *플레이어 Bust → 무조건 Lose*, *딜러 Bust + 플레이어 비Bust → 플레이어 Win*. *양측 Bust → 플레이어 Lose (카지노 룰)*. PR #128·#135·#114·#125·#108·#133·#132·#136 와 같은 결.
73
+
74
+ ### 5. `Fixture` 직접 활용 미숙 — 학생 자가 질문
75
+
76
+ 페로로 (RoleTest.kt:159 — 미해결): *"꼼꼼한 테스트 좋았습니다. Fixture를 조금 더 활용한다면, 이렇게도 생성해 볼 수 있어요. `val dealer = Dealer(HEART_TEN, HERART_SEVEN); val player = Player(HEART_TEN, HEART_FIVE)`"*
77
+
78
+ 학생 답변: *"감사합니다! 위 예시가 아직 잘 이해가 되지 않는 데 혹시 조언이나 자료를 좀 더 얻을 수 있을까요..? 🥲"*
79
+
80
+ → **Fixture = 생성자 인자 가변 + 매 테스트 다른 카드 조합**. *Dealer(card1, card2)* 같은 *생성자 카드 인자*가 *vararg 또는 List 인자*로 *유연한 테스트 데이터*. *현재 학생은 fixture 의미 학습 진행 중*. PR #90·#133·#136 의 *Fixture 활용 패턴* 과 비교: PR #103 은 *학습 진행 중*.
81
+
82
+ ### 6. `BlackJack` controller 가 *플레이어 준비 + 게임 진행* 책임 — *분리 부재 신호*
83
+
84
+ 페로로 (BlackJack.kt — 첫 두 코멘트): *플레이어 준비 + 배팅 금액 입력 + 16점 룰* 모두 *Controller 의 직접 책임*. *Game 도메인 객체 분리 부재*. PR #131·#132·#136·#152 와 같은 결의 *Controller god-object* 변형.
85
+
86
+ 학생 후속 반영으로 *플레이어 + 베팅 동시 입력*은 *생성 시점 응집*. 다만 *게임 진행 (딜러 16점 룰) 가 Controller 안*인지 *Dealer/Game 객체 안*인지 *코드 미공개*.
87
+
88
+ ### 7. `RandomDeck` *naming* — *deck = 셔플 결과 vs 셔플 방식*
89
+
90
+ → **`RandomDeck` = *셔플된 덱 = 랜덤 카드 시퀀스***. *덱 = 카드 모음 + 셔플 = 랜덤 순서* 라면 *Deck 만으로 충분*. *RandomDeck* 이 *고정 순서 Deck* 와 *대비 표현* 의도라면 *전략 패턴 (ShuffleStrategy)* 이 정공. PR #108·#133·#136·#93 의 *ShuffleStrategy / DeckManager interface* 와 같은 결.
91
+
92
+ ### 8. *수익률 계산 책임의 두 후보 (Participants vs FinalWinning) 자가 결정 — 근거 명시*
93
+
94
+ 페로로 메타 질문 → 학생 자가 결정 + 근거: *"FinalWinning으로 수익률을 계산하는 것을 옮겨보니 코드가 간결해졌다는 걸 느꼈습니다."*
95
+
96
+ → **결정 근거 = "코드 간결성"**. *PR #131·#132·#108·#133·#85 의 *수익률 책임 위치 토론* 과 같은 결*. 다양한 선택지 (Participant 자기 책임 vs Result 객체 응집)*. *해나 = FinalWinning 응집* 선택. PR #85 (하디) 의 *PlayerResult.profit by lazy* 와 같은 결.
97
+
98
+ ### 9. `BlackJack.kt:112` — Controller 직접 딜러 룰 보유
99
+
100
+ 페로로 (BlackJack.kt:112 — 미해결): *"딜러도 16점 이하라면, 16점을 넘을 때 까지 계속해서 뽑아야 합니다."*
101
+
102
+ 학생 후속 반영: *16점 룰 추가*.
103
+
104
+ → **딜러 룰 = Dealer 자기 책임 vs Controller 명령** — *Dealer.shouldDrawCard() = score <= 16* 메시지가 자연. PR #131·#132·#136 와 같은 결. *현재 코드 미공개* — *룰 위치 정확 확인 불가*.
105
+
106
+ ## 리뷰어 의견 요지
107
+
108
+ - **플레이어 준비 + 베팅 금액 동시 입력** — *생성 시점에 모든 정보 응집*.
109
+ - **딜러 = 베팅 안 함, 도메인 구분** — *Player ≠ Dealer 의 멤버 차이*.
110
+ - **딜러 16점 이상까지 hit** — *블랙잭 룰 정확성*.
111
+ - **상태 패턴 = 카드와 상태 결합 해소** — *플레이어 stay 상태 + 카드 차단*.
112
+ - **수익률 계산 위치 = 메타 질문으로 학생 자가 결정 유도** — *Participants vs FinalWinning*.
113
+ - **Bust 무조건 패배 = 상대 패 무관** — *블랙잭 룰 정확성*.
114
+ - **MutableMap 인자 = 부수효과 시그니처** — *calculate 메서드 반환 + 외부 변경* 분리.
115
+ - **`_cardDeck` + `cardDeck` 이중 표현 = 불필요한 중복 + 추측 코딩** — *YAGNI 위반*.
116
+ - **Fixture 활용 + 생성자 가변 인자** — *유연한 테스트 데이터*.
117
+
118
+ ## 대표 인용
119
+
120
+ **페로로 (Bust 무조건 패배, Role.kt):**
121
+ > 내가 버스트라면 상대의 패와 상관없이 무조건 패배합니다.
122
+
123
+ **페로로 (수익률 책임 위치 메타 질문, Participants.kt):**
124
+ > 수익률은, 게임 결과인 FinalWinning이 계산하는 것과 Participants가 계산하는 것 중 누가 하는 것이 적절하다고 생각하시나요?
125
+
126
+ **페로로 (딜러 베팅 도메인 구분, Dealer.kt):**
127
+ > 배팅 금액은 플레이어에게만 있는 개념이 아닐까요?
128
+ > 딜러의 입장에서는, 배팅을 하지 않으니까요
129
+
130
+ **페로로 (1단계 진단 연장, CardHand.kt:31):**
131
+ > 플레이어는 스테이 상태를 선언하면, 카드를 더 이상 뽑을 수 없어요.
132
+ > 이 개념을 구현 해보시면 좋을 것 같습니다.
133
+
134
+ **페로로 (이중 표현 무의미, RandomDeck.kt:6):**
135
+ > 둘 다 모두 `List<Card>` 타입이고, 따로 두개가 나뉘어진 이유가 모르겠네요!?
136
+
137
+ **페로로 (Fixture 활용 권고, RoleTest.kt:159):**
138
+ > 꼼꼼한 테스트 좋았습니다.
139
+ > Fixture를 조금 더 활용한다면, 이렇게도 생성해 볼 수 있어요.
140
+ > ```kotlin
141
+ > val dealer = Dealer(HEART_TEN, HERART_SEVEN)
142
+ > val player = Player(HEART_TEN, HEART_FIVE)
143
+ > ```
144
+
145
+ **학생 자가 답변 (수익률 책임 자가 결정, Participants.kt):**
146
+ > FinalWinning이 좀 더 적절한 것 같습니다! Participants와 FinalWinning 중 고민 했었는 데 FinalWinning으로 수익률을 계산하는 것을 옮겨보니 코드가 간결해졌다는 걸 느꼈습니다. 감사합니다!
147
+
148
+ **학생 자가 답변 (1단계 진단 인용 + 후속 반영, CardHand.kt:31):**
149
+ > > 지난번 플레이어와 딜러가 카드 상태랑 강하게 결합되어 있다는 말을 드렸는데,
150
+ > > 플레이어가 스테이가 될 수 있다는 상태가 고려한다면 도움이 좀 될 것 같습니다.
151
+ >
152
+ > 이와 관련해 step1에서 남겨 주신 조언 참고해서 피드백 반영해보았습니다!
153
+
154
+ **학생 자가 답변 (Bust 룰 정확성 자가 정리, Role.kt):**
155
+ > ```
156
+ > - 플레이어가 Bust라면 딜러의 패와 상관없이 무조건 패
157
+ > - 딜러가 Bust이고, 플레이어가 Bust가 아니라면 딜러 패
158
+ > ```
159
+ > 피드백 주신 내용 참고해 위의 두가지 조건 추가하였습니다!
160
+
161
+ **학생 자가 답변 (추측 코딩 자가 인식, RandomDeck.kt:6):**
162
+ > _cardDeck에는 실제 카드 덱을 저장하고, cardDeck을 이용해 클래스 외부에서는 카드 덱 데이터를 읽을 수는 있지만, 직접 수정할 수는 없게 하려고 했었습니다. 리팩터링 하다보니 cardDeck을 외부에서 사용할 때가 없어졌는 데 추후에 사용할 일이 있을까봐 일단은 private으로 설정해뒀습니다!
163
+
164
+ ## 얻은 교훈
165
+
166
+ 1. ***플레이어 준비 + 베팅 금액 동시 입력 = 생성 시점에 모든 정보 응집***. PR #85·#88·#90·#108·#133 와 같은 결. *Player(name, betAmount) 생성 시점에 한 번에 받음*.
167
+
168
+ 2. ***딜러 ≠ 플레이어 = 도메인 멤버 차이***. *Dealer 는 베팅 안 함 → betAmount 미보유*. *Player 와 Dealer 의 비대칭이 도메인 룰 표현*. PR #133·#85·#136 와 같은 결.
169
+
170
+ 3. ***블랙잭 Bust 룰 = "무조건 패배 (상대 패 무관)"*** = *카지노 룰 정확성*. *플레이어 Bust → Lose 즉시*, *양측 Bust → 플레이어 Lose*, *딜러 Bust + 플레이어 비Bust → 플레이어 Win*. PR #128·#135·#114·#125·#108·#133·#132·#136·#90·#88·#85 와 같은 결.
171
+
172
+ 4. ***메타 질문으로 자가 결정 유도 = 학습 모범***. *페로로의 "Participants vs FinalWinning 중 누가 적절한가?"* 메타 질문 → *학생 자가 답변 + 근거 명시*. *맞고 틀림 X, 트레이드오프*. PR #131·#136·#88 와 같은 결의 reviewer 스타일.
173
+
174
+ 5. ***1단계 진단 인용 + 후속 반영 = 진단 인식 학습 모범***. *학생이 1단계 페로로 코멘트 직접 인용*. *진단 누적 + 후속 회기 회피*. PR #128·#135·#108·#133·#136 와 같은 결.
175
+
176
+ 6. ***`_cardDeck` + `cardDeck` 이중 표현 = 추측 코딩 + YAGNI 위반***. *Kotlin backing field 패턴 = `private val _x` + `val x: get() = _x.toList()`*. *둘 다 private + 동일 타입* 이면 *불필요한 중복*. *현재 사용처 시작 + 필요 시 추가* 정공.
177
+
178
+ 7. ***`calculatePlayerProfit(MutableMap)` 인자 = 부수효과 메서드 시그니처***. *PR #85 (하디 2단계) 의 calculateFinalProfits 진단* 와 같은 결. *calculate = 반환*, *부수효과 ≠ calculate 어휘*. *학생 자가 후퇴*.
179
+
180
+ 8. ***Fixture 활용 + 생성자 가변 인자 = 유연한 테스트 데이터***. *PR #90 (케이엠) 의 fixture + CsvSource* 와 같은 결. *현재 학생은 학습 진행 중* — *fixture 의미 자가 질문*.
181
+
182
+ 9. ***`RandomDeck` naming = ShuffleStrategy interface vs 클래스 직접*** = *전략 패턴 정공 vs 단일 구현*. PR #108·#133·#136·#93 의 *ShuffleStrategy / DeckManager interface* 와 *반대 트레이드오프*. *테스트 시 결정적 카드 시퀀스 필요* 시 *전략 패턴*이 정공.
183
+
184
+ 10. ***학생 자가 답변에 커밋 SHA 첨부 = 진단 → 후속 반영 흐름 명시***. *14775ee, 55d2dcf, e0f3ef7, a69ea03, 2253b73, 4503d84, 68dd994* 등 다수. *학습 가시화 패턴 일관성*. PR #128·#135·#108·#133·#88·#136 와 같은 결.
185
+
186
+ 11. ***리뷰어 메타 질문 + 학생 자가 결정 + 근거 명시 + 코드 간결성 trade-off 명시 = 학습 모범***. *PR #103 은 짧지만 깊은 토론* — *짧은 PR 이라도 학습 가시화 가능*. PR #131·#136 와 같은 결의 *짧은 PR + 풍부한 자가 학습*.
187
+
188
+ 12. ***수익률 계산 책임 후보 (Participants vs FinalWinning) = 트레이드오프 명시***. *Participants 자기 책임 (Tell-Don't-Ask) vs Result 객체 응집*. *둘 다 합리*. *학생 자가 결정 근거 = 코드 간결성*. *결정의 근거 명시 자체*가 *학습 가치*. PR #85·#108·#131·#132·#133·#136·#152 와 같은 결의 *책임 위치 토론*.
@@ -0,0 +1,301 @@
1
+ # PR #81 — [블랙잭 1단계] 해나 미션
2
+
3
+ - **Reviewee:** [@hxeyexn](https://github.com/hxeyexn)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/81
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @laco-dev
7
+ - **라인 코멘트:** 30 (리뷰어 19 / 리뷰이 11)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`CardHandState` enum + `precondition` 속성** — 상태별 임계점 상수화 (후속 반영).
12
+ - **`PlayerName` 원시값 포장**.
13
+ - **`abstract class Role` + `Player`/`Dealer`** + 후속에 `addInitialCards` 추상 공통화.
14
+ - **`CardGenerator` 인터페이스 + `RandomCardGenerator`/`ExplicitCardGenerator`** — 테스트 fake 분리.
15
+ - **`PlayerWinning.judgeDealerWinningResult` (groupingBy + eachCount + reverse) — 역집계** (후속 반영).
16
+ - **후속 반영 — Ace 1점 기본 + 11 검토 룰 변경 / Singleton Deck → CardIndex reset / Shape/Number UI → OutputView / canDraw() 상태 반환 / Referee 제거 + Dealer로 책임 이전**.
17
+
18
+ ## 못한 점 (설계 관점)
19
+
20
+ ### 1. `CardShape.shape: String` UI 표현
21
+
22
+ ```kotlin
23
+ enum class CardShape(val shape: String) { HEART("하트"), CLOVER("클로버"), ... }
24
+ ```
25
+
26
+ 리뷰어: "*"하트", "클로버" 는 UI 로직이 아닐까요? 가령 `♤ ♠` 처럼 출력해야 한다면 도메인 모델의 수정이 불가피*합니다." — **12개 PR 연속 enum UI value**.
27
+
28
+ ### 2. `CardNumber.JUMP` — JACK 오타
29
+
30
+ ```kotlin
31
+ enum class CardNumber(val number: Int, val output: String = number.toString()) {
32
+ ACE(11, "A"), TEN(10), KING(10), QUEEN(10),
33
+ JUMP(10), // ⚠ JACK 오타
34
+ }
35
+ ```
36
+
37
+ 리뷰어: "*플레잉 카드에서 J는 JACK 입니다!*" — *도메인 어휘 정확성*. `JUMP`는 *도메인 부재*. **JACK 명사 모름 = 도메인 조사 부족 신호**.
38
+
39
+ ### 3. `CardNumber.ACE.number = 11` 기본값
40
+
41
+ → PR #119·#29·#112·#17과 동일. *Ace 1 기본*이 도메인 룰. 학생 후속 인정: "*제가 규칙을 잘못 이해하고 있었네요* 🥲".
42
+
43
+ ### 4. `CardDeck` Singleton + 게임 단발
44
+
45
+ ```kotlin
46
+ object CardDeck {
47
+ private val cardDeck = CardShape.entries.flatMap { ... }.shuffled()
48
+ private var cardIndex = 0
49
+ fun getRandomCard(): Card = cardDeck[cardIndex++]
50
+ }
51
+ ```
52
+
53
+ 리뷰어: "*단 하나만 존재하는 덱이네요* 😱 *게임이 여러 번 진행 되면 어떤 일이 발생할까요?*"
54
+
55
+ 학생 자가 인정: "*플레이어 수를 6명으로 제한해 52장의 카드를 모두 소진할 일이 없다고만 생각했습니다. 게임이 여러 번 진행되었을 때는 고려하지 못했던 것 같습니다..!* CardIndex 를 reset 하는 방식으로 수정해보았습니다." — **Singleton + reset** = *상태 가변 + Singleton 결합 = 더 복잡*. *class Deck + 매 게임 새 인스턴스*가 정답. 학생의 reset 패치는 *Singleton 유지의 미봉책*.
56
+
57
+ ### 5. `CardHand.sum()`의 `while + 차감 + count Ace`
58
+
59
+ ```kotlin
60
+ fun sum(): Int {
61
+ var aceCount = hand.count { it.number == CardNumber.ACE }
62
+ var tempSum = hand.sumOf { it.number.number }
63
+ while (aceCount >= MIN_ACE_COUNT && tempSum > BLACK_JACK) {
64
+ aceCount--
65
+ tempSum -= SUBTRACTION_BETWEEN_MAX_AND_MIN
66
+ }
67
+ return tempSum
68
+ }
69
+ ```
70
+
71
+ 리뷰어: "*블랙잭에서 A 카드의 기본 점수는 1점입니다.* 아래 점수 계산 규칙을 참고해보시고, *어떻게 수정할 수 있을지 고민 해보세요* :) > *에이스 카드가 포함되어 있을 때, 카드들의 점수 합계가 11점보다 낮다면 보너스 점수 10점을 획득한다.*"
72
+
73
+ → PR #112·#29·#33·#10·#17·#119와 동일한 *while + 차감* 패턴. *단일 룰*로 단순화. 학생 후속 반영.
74
+
75
+ ### 6. `CardHand.addNewCard()`이 `CardDeck.getRandomCard()` 직접 호출
76
+
77
+ ```kotlin
78
+ fun addNewCard() {
79
+ _hand.add(CardDeck.getRandomCard()) // ⚠ Singleton 직접 호출
80
+ }
81
+ ```
82
+
83
+ 리뷰어: "*무엇이 들어올지 모르는 카드를 뽑게 되는 행위는 테스트가 가능한 구조*일까요?" — *Singleton 의존 = 테스트 격리 불가*. `addNewCard(card: Card)` 또는 `addNewCard(generator: CardGenerator)`. 학생 후속: `ExplicitCardGenerator` 도입.
84
+
85
+ ### 7. `Player.getState()` *Bust + BlackJack + 카드 합* — *Hit/Stay 누락*
86
+
87
+ ```kotlin
88
+ override fun getState(): CardHandState {
89
+ val sum = cardHand.sum()
90
+ return when {
91
+ sum > BLACK_JACK -> CardHandState.BURST
92
+ sum == BLACK_JACK -> CardHandState.BLACKJACK
93
+ else -> CardHandState.STAY // ⚠ 21 미만이면 무조건 STAY?
94
+ }
95
+ }
96
+ ```
97
+
98
+ 리뷰어: "*플레이어의 상태는 단순히 카드 점수로만 판단할 수 없습니다.* 가령 *21점이 넘지 않더라도 플레이어가 더 뽑겠다고 한다면 HIT 상태가 되고, 그만 뽑겠다고 하면 STAY 상태*가 됩니다. *상태를 반환하는 방식과 상태를 내부적으로 변경 가능하도록 가지고 있도록 하는 차이*가 있을 것 같습니다. `var state: State; private set`"
99
+
100
+ → **상태가 *점수만으로 결정*되지 않음**. *21 미만 + HIT 의사 = HIT*, *21 미만 + STAY 의사 = STAY*. *유저 선택*이 상태 전이의 트리거. 학생 후속: `CardHandState.DRAW_POSSIBILITY`로 *카드 더 받을 수 있음*만 표현, *Hit/Stay 결정*은 외부에서.
101
+
102
+ ### 8. `BLACK_JACK = 21` 상수가 *여러 곳 중복*
103
+
104
+ 리뷰어: "*`블랙잭 = 21` 이라는 값이 여러군데서 재사용이 되고 있어요.* 만약 *블랙잭 점수가 22점으로 바뀐다면 악몽이 벌어지지 않을까요?*" — *도메인 상수의 단일 정의*. 학생 후속: `CardHandState.BLACKJACK.precondition`으로 *enum 속성*에 통합.
105
+
106
+ ### 9. `Referee` 정적 비교자 → 학생 Dealer로 이전
107
+
108
+ 리뷰어: "*승부를 판단하는 로직은 참가자가 스스로 할 수 있지 않을까요?* *Referee 라는 객체는 단순히 함수를 분리한 것으로밖에 보이지 않아, 클래스로서의 목적이 명확하지 않습니다.* WinningResult를 만들어 내기에 적절한 위치는 없을까요?"
109
+
110
+ 학생 자가 인정: "*클래스의 역할과 책임에 대해 다시 한 번 생각해 볼 수 있게 질문 주셔서 감사합니다.* 🙇 *승부를 판단하는 로직은 Dealer의 책임이라는 판단*이 서서 *Dealer로 해당 로직을 이동*시켰습니다."
111
+
112
+ → **Referee → Dealer 이전은 *PR #28·#63 권고와 부분 일치 + 참가자 자율성과 부분 어긋남***. *Dealer가 비교자*는 *현실 비유 충실*, *Tell-Don't-Ask는 player.match(other)*. 학생은 *중간 단계* 도달.
113
+
114
+ ### 10. `PlayerWinning(result: Map<...>)` data class — *역할 모호*
115
+
116
+ ```kotlin
117
+ data class PlayerWinning(val result: Map<PlayerName, WinningResultStatus>)
118
+ data class DealerWinning(val result: Map<WinningResultStatus, Int>)
119
+ ```
120
+
121
+ 리뷰어: "*객체 이름만 본다면, 플레이어 하나의 승부 결과를 가지고 있을 것처럼 느껴지는데, 실제로는 무엇을 하는지 잘 모르겠어요.* *이 클래스가 정말 필요한 것일까요?*"
122
+
123
+ 학생 자가 변호: "*data class 내 딜러의 승부를 판단하는 책임은 불필요하지만, PlayerWinning이라는 class 자체는 플레이어들의 결과를 담고 있어야 하기 때문에 필요하다고 생각*합니다..!"
124
+
125
+ → **명사 PlayerWinning vs 실제 보유 (Map<Player, Status>) 의미 불일치**. *PlayerWinning = 플레이어 하나의 결과* 직관 vs *실제 = 다수 플레이어의 결과 묶음*. `PlayersResult` 또는 *Map 노출* 자체가 자연. 단수/복수 명명 정확성.
126
+
127
+ ### 11. `DealerWinning.result: Map<WinningResultStatus, Int>` value 의미 모호
128
+
129
+ ```kotlin
130
+ data class DealerWinning(val result: Map<WinningResultStatus, Int>)
131
+ ```
132
+
133
+ 리뷰어: "*result 에 담겨있는 value 값이 무엇인지 알기 어려워 보입니다.* 적절한 메소드를 통해 메시지를 전달 해보면 어떨까요? `fun getWinningCount(): Int { ... } fun getDrawCount(): Int { ... }`" — *Map 자료구조 그대로 노출* < *메서드로 의미 명시*. *호출자가 Map["WIN"] 같은 키 추측* 회피.
134
+
135
+ 후속 댓글: "*이 의문이 해결되지 않았어요. 아직 `getFinalResult()` 의 반환 타입이 무엇인지 모르지 않을까요?*" — 학생이 *getFinalResult(): Map<WinningResultStatus, Int>* 형태로 *그대로 반환*. 리뷰어는 *반환 타입 자체가 의미*임을 재강조.
136
+
137
+ ### 12. `BlackJack.runPlayerPhase`의 *상태 판단 + 입력 + 분기 한 줄*
138
+
139
+ ```kotlin
140
+ private fun runPlayerPhase(it: Player) {
141
+ while (it.getState() == CardHandState.STAY && inputView.readIsHit(it)) {
142
+ it.runPhase()
143
+ outputView.printPlayerCardHand(it)
144
+ }
145
+ }
146
+ ```
147
+
148
+ 학생 자가 인정: "*하지만 초반 설계처럼 runPhase의 파라미터 값에 HIT 여부를 넣고, while(runPhase(inputView.readIsHit))의 형태로 컨트롤러에서 사용하면 Player의 카드 패가 Black Jack 이거나 BUST 라도 플레이어에게 카드를 더 받겠냐는 질문을 한번 더 출력*하게 됩니다."
149
+
150
+ 리뷰어: "*블랙잭 게임에서 STAY는 카드를 더이상 뽑지 않겠다를 선언한다는 의미*입니다. *블랙잭 도메인이 어려워 이 부분은 잘못 알고 계신 것 같네요.* [...] *카드를 더 뽑을 수 있는지 여부를 묻는 로직*이 보이지 않는데요. *Input 이전에 플레이어 혹은 딜러가 카드를 더 뽑을 수 있는지를 물어봐야 하지 않을까요?* `player.canDraw() && askDraw(player)`"
151
+
152
+ → **블랙잭 STAY 의미 오해**: 학생의 `CardHandState.STAY`는 *21 미만 일반 상태*로 사용. 룰: *STAY = 사용자가 그만 뽑겠다 선언*. 학생 자가 인정 후 `canDraw()` 메서드 도입. PR #28·#114·#10과 같은 결.
153
+
154
+ ### 13. `runPhase()` 명명 — *카드 뽑는 행위가 phase?*
155
+
156
+ 리뷰어: "*또한 `runPhase` 라는 이름이 무엇을 의도하는지 잘 모르겠습니다. 단순하게 카드를 뽑는다는 행위로 나타내고 싶은게 아닌가요?* `drawTo(...)`" — *추상 명사*(`runPhase`/`processTurn`/`step`)보다 *구체 행위*(`drawCard`/`receiveCard`). PR #29·#92와 같은 결.
157
+
158
+ ### 14. `BlackJack.cardDeck = CardDeck.cardDeck` — 클래스 레벨 + Singleton 참조
159
+
160
+ ```kotlin
161
+ class BlackJack(...) {
162
+ private val cardDeck = CardDeck.cardDeck // ⚠ 멤버 + Singleton 참조
163
+ }
164
+ ```
165
+
166
+ 리뷰어: "*딜러와 플레이어는 지역변수로 준비가 되는데 덱은 클래스 레벨에서 생성을 하는 이유는 무엇일까요?*" — **일관성 누락**. *한 게임 = 한 인스턴스*면 *덱도 지역 변수*. *Singleton 잔재*가 *클래스 레벨* 보유로 드러남.
167
+
168
+ ### 15. `Role`이 `CardGenerator` 의존 — Deck이 아닌 Generator
169
+
170
+ ```kotlin
171
+ abstract class Role(open val name: PlayerName, open val cardHand: CardHand) {
172
+ fun addInitialCards(cardGenerator: CardGenerator) {
173
+ repeat(INITIAL_CARDS_COUNT) { cardHand.addNewCard(cardGenerator) }
174
+ }
175
+ fun runPhase(cardGenerator: CardGenerator) { ... }
176
+ }
177
+ ```
178
+
179
+ 리뷰어: "*참가자가 CardGenerator와 협력하는게 자연스러운 흐름인가요? 아니면 CardGenerator와 협력하는게 자연스러운 흐름인가요?* *덱을 통해 받지 않은 이유가 있나요?* *CardDeck이 고도화가 되고 역할이 만들어지지 않고, 엉뚱한 다른 객체가 만들어진 것 같아서요.*" — **`Deck`이 *카드 보유자 + 뽑기*면, `Generator`는 *Deck의 내부 구현* 또는 *Deck 생성용*. Role이 직접 Generator 의존 = *Deck 추상화 누수***. PR #24·#10·#29와 같은 결.
180
+
181
+ ### 16. `Player.getState`가 *cardHand.sum()* 외부 계산
182
+
183
+ ```kotlin
184
+ data class Player(...) : Role(...) {
185
+ override fun getState(): CardHandState {
186
+ val sum = cardHand.sum()
187
+ return when { ... }
188
+ }
189
+ }
190
+ ```
191
+
192
+ 리뷰어: "*CardHand가 CardHandState를 가지고 있어야 자연스럽지 않을까요??* 이미 *CardHand가 블랙잭 도메인에 강하게 결합*되어 있다면, *스스로 상태를 가지고 판단*하도록 하는게 어떨까요?" — *Player가 cardHand.sum()* + 분기 = *Tell-Don't-Ask 변형 위반*. `cardHand.getState()`가 자연.
193
+
194
+ ### 17. `Dealer.canDraw()` — Player와 다른 메서드명
195
+
196
+ ```kotlin
197
+ data class Dealer(...) : Role(...) {
198
+ fun canDraw(): Boolean = this.getState() == CardHandState.HIT
199
+ }
200
+ ```
201
+
202
+ 리뷰어: "*이 함수는 플레이어와 딜러가 모두 동일하게 가지고 있다면, 추상 함수로 만들어 볼 수 있지 않을까요?*" — `canDraw()`가 *공통 행위*면 `Role.canDraw(): Boolean` 추상. *Dealer 단독*은 *추상화 누락*.
203
+
204
+ ### 18. `Participants.getPlayerResult` + 별도 `getDealerResult` — 결과 객체 분산
205
+
206
+ ```kotlin
207
+ data class Participants(val dealer: Dealer, val players: Players) {
208
+ fun getPlayerResult(): Map<PlayerName, Int> = ...
209
+ // getDealerResult가 별도
210
+ }
211
+ ```
212
+
213
+ 리뷰어: "*결과를 만들어내는 동작이 왜 따로따로 존재하는지 의아*합니다. *플레이어 결과와 딜러 결과를 모두 가지는 게임 결과를 생성하도록 만들 수 있지 않을까요?* *그 역할은 누가 해야 적절할까요?*" — *GameResult* 단일 객체에 *Player + Dealer 결과*. PR #112·#135·#92와 같은 결.
214
+
215
+ ### 19. `CardHandTest`에 *명시 deck + 합산 + Ace 보정* 다중 검증
216
+
217
+ ```kotlin
218
+ class CardHandTest {
219
+ // 딜러나 플레이어 카드 패의 합을 구하는 동작은 완전히 같다.
220
+ private val explicitCardDeck = listOf(... 7장 ...)
221
+ @Test fun `...`() { ... }
222
+ }
223
+ ```
224
+
225
+ 리뷰어: "*무엇을 테스트 하고 싶은 걸까요??* 🤔" / "*이 규칙으로 시나리오를 다시 고려 해보셨을까요? 테스트가 너무 복잡하게 판단이 되는 것 같습니다.* *TDD로 구현한다*..."
226
+
227
+ → **테스트 의도 불명** + **시나리오 복잡 = TDD 사이클 위반**. *한 테스트 = 한 시나리오*가 *Red 단계의 명확성*. *7장 fixture*는 *여러 시나리오가 한 데이터에 섞임*.
228
+
229
+ ### 20. `DealerTest`에 *테스트 로직 보유*
230
+
231
+ ```kotlin
232
+ @Test fun `...`() {
233
+ if (dealer.getState() == CardHandState.HIT) { // ⚠ 테스트에 if 분기
234
+ // 한 장 더 뽑기 검증
235
+ }
236
+ }
237
+ ```
238
+
239
+ 리뷰어: "*테스트 코드에 로직을 포함하면 안됩니다.* 한 장을 더 뽑는다는 메시지는 *`canDraw()` 를 통해 판단해야 하지 않을까요?*" — *테스트 = 명세*. *if 분기는 두 가지 시나리오를 한 테스트에 담음*. *시나리오 분리*가 정답.
240
+
241
+ ## 리뷰어 의견 요지
242
+
243
+ - ***enum UI value (12개 PR 연속)***.
244
+ - ***JACK 오타 = 도메인 어휘 부정확***.
245
+ - ***Ace 1 기본 (학생 자가 인정)***.
246
+ - ***Singleton Deck + reset = 미봉책*** — class + 매 게임 새 인스턴스.
247
+ - ***while + 차감 Ace 보정 < 단일 룰***.
248
+ - ***CardHand가 Singleton Deck 직접 호출 = 테스트 불가***.
249
+ - ***Player 상태 = 점수 외 유저 선택 결합*** — HIT/STAY는 의지의 결과.
250
+ - ***`BLACK_JACK = 21` 상수 중복*** — enum 속성으로 단일 정의.
251
+ - ***Referee → Dealer 이전은 중간 단계*** — 참가자 자율성이 정답.
252
+ - ***`PlayerWinning(Map<Player, Status>)` 단수/복수 명명 불일치***.
253
+ - ***Map 그대로 노출 < 메서드로 의미 명시***.
254
+ - ***블랙잭 STAY = 그만 뽑겠다 선언*** — 학생 도메인 오해.
255
+ - ***`runPhase` 추상 명사 < `drawCard` 구체 행위***.
256
+ - ***Deck 클래스 레벨 + 참가자 지역 변수 = 일관성 누락***.
257
+ - ***Role이 Generator 직접 의존 = Deck 추상화 누수***.
258
+ - ***`player.getState`가 cardHand.sum() = CardHand가 state 보유 자연***.
259
+ - ***Dealer.canDraw 단독 = 추상화 누락*** — Role.canDraw 추상.
260
+ - ***Player + Dealer 결과 분산 = GameResult 단일 객체***.
261
+ - ***테스트 7장 fixture = 시나리오 다중*** — 한 테스트 한 시나리오.
262
+ - ***테스트 로직 (if 분기) = 시나리오 분리 필요***.
263
+
264
+ ## 대표 인용
265
+
266
+ > 단 하나만 존재하는 덱이네요 😱 *게임이 여러 번 진행 되면 어떤 일이 발생할까요?*
267
+ > — @laco-dev on `CardDeck.kt`
268
+
269
+ > 플레이어의 상태는 *단순히 카드 점수로만 판단할 수 없습니다*. 가령 *21점이 넘지 않더라도 플레이어가 더 뽑겠다고 한다면 HIT 상태가 되고, 그만 뽑겠다고 하면 STAY 상태*가 됩니다.
270
+ > — @laco-dev on `Player.kt`
271
+
272
+ > 승부를 판단하는 로직은 *참가자가 스스로 할 수 있지 않을까요? Referee 라는 객체는 단순히 함수를 분리한 것으로밖에 보이지 않아, 클래스로서의 목적이 명확하지 않습니다.*
273
+ > — @laco-dev on `Referee.kt`
274
+
275
+ > 참가자가 CardGenerator와 협력하는게 자연스러운 흐름인가요? 아니면 CardGenerator와 협력하는게 자연스러운 흐름인가요? *덱을 통해 받지 않은 이유가 있나요?* CardDeck이 고도화가 되고 역할이 만들어지지 않고, *엉뚱한 다른 객체가 만들어진 것 같*아서요.
276
+ > — @laco-dev on `Role.kt`
277
+
278
+ > `CardHand가 CardHandState를 가지고 있어야 자연스럽지 않을까요?? 이미 CardHand가 블랙잭 도메인에 강하게 결합되어 있다면, 스스로 상태를 가지고 판단하도록* 하는게 어떨까요?
279
+ > — @laco-dev on `Player.kt`
280
+
281
+ ## 얻은 교훈
282
+
283
+ - ***enum UI value = 12개 PR 연속 (MCP 룰 후보 최강)***.
284
+ - ***JACK 오타 = 도메인 어휘 정확성 부족 신호*** — *플레잉 카드 룰*을 *코드 작성 전 조사*.
285
+ - ***Singleton Deck + reset = 미봉책*** — *class + 매 게임 새 인스턴스*가 정답. PR #65·#79·#125·#92·#33·#10·#17와 같은 결.
286
+ - ***while + 차감 Ace 보정 = 알고리즘으로 룰 흩뜨림*** — *Ace 1 기본 + 11 검토 단일 룰*. 8개+ PR 연속.
287
+ - ***Singleton Deck을 도메인 메서드가 직접 호출 = 테스트 격리 불가*** — Generator 인터페이스 주입.
288
+ - ***Player 상태 = 점수 + 유저 의지 결합*** — *21 미만 + HIT 의사 = HIT*. *점수만으로 STAY 결정*은 도메인 오해.
289
+ - ***`BLACK_JACK = 21` 상수 중복 = 변경 시 여러 곳 수정*** — enum 속성 또는 단일 정의.
290
+ - ***Referee → Dealer 이전은 중간 단계*** — *Dealer 비교자*는 *현실 비유*, *Tell-Don't-Ask*는 *player.match(other)*. 학생이 *중간 단계 도달*.
291
+ - ***`PlayerWinning(Map<Player, Status>)` 단수/복수 명명 불일치*** — *PlayerWinning = 1인분*인지 *다수의 결과 묶음*인지. *PlayersResult* 같은 *복수형*이 자연.
292
+ - ***Map 자료구조 그대로 노출 < 메서드로 의미 명시*** — `getWinningCount()` / `getDrawCount()`.
293
+ - ***블랙잭 STAY = 그만 뽑겠다 선언, 일반 상태 X*** — *학생 도메인 오해*. **블랙잭 룰 정확 이해가 13개+ PR 반복 권고 (MCP 룰 후보)**.
294
+ - ***`runPhase` 추상 명사 < `drawCard` 구체 행위*** — *동작 = 동사*가 가독성. PR #29·#92와 같은 결.
295
+ - ***Deck 클래스 레벨 + 참가자 지역 변수 = 일관성 누락*** — *Singleton 잔재*가 멤버 보유로 드러남.
296
+ - ***Role이 Generator 직접 의존 = Deck 추상화 누수*** — *Generator는 Deck의 내부 구현*. *Role은 Deck과만 협력*.
297
+ - ***`player.getState`가 cardHand.sum() = CardHand가 state 보유 자연*** — *CardHand가 블랙잭 도메인 결합*되어 있으면 *스스로 상태 판단*.
298
+ - ***Dealer.canDraw 단독 = 추상화 누락*** — `Role.canDraw` 추상.
299
+ - ***Player + Dealer 결과 분산 = GameResult 단일 객체*** — *결과 생성 책임자*는 *진행자(Game)*가 자연.
300
+ - ***테스트 7장 fixture = 시나리오 다중 = TDD Red 단계 명확성 위반*** — *한 테스트 한 시나리오*.
301
+ - ***테스트 로직 (if 분기) = 두 시나리오 한 테스트*** — 분리.