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,726 @@
1
+ # PR #129 — [블랙잭 1단계] 비비 미션
2
+
3
+ - **Reviewee:** [@rosemin928](https://github.com/rosemin928)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/129
5
+ - **단계:** 1단계
6
+ - **리뷰어:** [@KwonDae](https://github.com/KwonDae) (제이든) — 기존 reviewer (batch 12 신규 합류)
7
+ - **라인 코멘트:** 22 스레드 — *Tell-Don't-Ask + 현실 메타포 정공 (게임 승패 = 외부 장치 X, 참가자 자가 결정) + 추상화 활용 점검 (개별 객체에 책임 위임 시 공통 사항 자가 발견) + sealed interface vs abstract class vs open class 학생 자가 학습 + Deck 테스트 가능성 + interface 분리 + 모든 22 스레드 학생 자가 답변 + 커밋 SHA 첨부 + 커뮤니케이션 메타 (줄글 vs 핵심 내용)*
8
+ - **신규 reviewee** (2025년 코호트 — 모바일 안드로이드 7기, PR #117 와 동일 코호트).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. PR 본문 자가 의문 + 셀프 체크리스트 + 집중 리뷰 영역 명시 (2025 코호트 스타일)
13
+
14
+ PR 본문 구조:
15
+ - **셀프 체크리스트 7항목** (PR #117 와 동일).
16
+ - **집중 리뷰 영역 자가 명시** *"인덴트 depth를 신경 써보면서 작성을 했지만 여전히 여러 부분에서 depth가 2를 넘겼습니다... 특히 BlackJackGame 클래스에서 playGame 함수에서 depth가 깊어지게 됐는데 이를 어떻게 분리해야 할 지 모르겠어서 수정하지 못했습니다."*
17
+
18
+ → **체계화된 PR 본문 모범 + 학생 자가 한계 인정** — *학습 적극성*. PR #117 결의 *2025 코호트 스타일*. PR #95·#98·#46·#73·#36·#87·#117 결의 *학생 자가 한계 인정* 어휘 합류.
19
+
20
+ ### 2. 모든 22 스레드 학생 자가 답변 + 커밋 SHA 첨부 + 자가 후속 의문
21
+
22
+ 22 스레드 전부 학생이 *반영 커밋 링크 (commit SHA)* 첨부 + **자가 후속 의문 5+ 회**:
23
+
24
+ - Thread 1: *deal 여러 명 = `first()` vs `single()` vs `List<Dealer>` 자가 의문*.
25
+ - Thread 5: *Participants 객체 생성 자가 적용 + Player ↔ Participants 분리 자가 설명*.
26
+ - Thread 7: *승패 로직 Player 이동 자가 의문 (Participant vs Player 위치 토론)*.
27
+ - Thread 10: *검증 코드 함수 분리 vs require 자가 의문 + Reviewer 답변 받음*.
28
+ - Thread 22: *결과 로직 ResultCalculator 분리 자가 의문* (PR 본문 외 추가 의문).
29
+
30
+ → **학생 자가 학습 가시화 정점** + **자가 후속 의문 풍부** = *PR #117 (parkjiminnnn) 결의 *모든 스레드 commit 첨부* + *PR #133·#137·#148·#151·#146·#147 결의 *학생 자가 의문*** 결합.
31
+
32
+ ### 3. `Participants(dealer: Dealer, players: List<Player>)` 생성자 타입 분리
33
+
34
+ ```kotlin
35
+ class Participants(
36
+ val dealer: Dealer,
37
+ val players: List<Player>,
38
+ ) {
39
+ fun getChoice(deck: Deck, getPlayerChoice: ..., onPlayerStateUpdated: ...) {
40
+ players.forEach { player -> player.choice(deck, getPlayerChoice, onPlayerStateUpdated) }
41
+ }
42
+ }
43
+ ```
44
+
45
+ → **딜러/플레이어 생성자 타입 분리 = 컴파일러 강제** — *List<Participant> + first() 분리 vs 생성자 타입 분리*. **MCP 룰 `compile-time-singleton-vs-runtime-filter` 후보**.
46
+
47
+ 학생 자가 적용 (Thread 11·12):
48
+ - `Participants(participants: List<Participant>)` → `filter { it is Dealer }.first()` (학생 초안)
49
+ - `Participants(dealer: Dealer, players: List<Player>)` (학생 자가 적용)
50
+
51
+ reviewer 후속 (Thread 12): *"생성자 프로퍼티 선언이 현재 유의미하게 사용되고 있을까요?"* → 학생 자가 깨달음: *"불필요한 변수가 된다는 것을 깨달았습니다"*.
52
+
53
+ ### 4. `ParticipantCards` 객체 분리 — Participant god-object 회피
54
+
55
+ ```kotlin
56
+ class ParticipantCards(private val _cards: MutableList<TrumpCard> = mutableListOf()) {
57
+ val allCards: List<TrumpCard> get() = _cards.toList()
58
+ val sumOfCards: Int get() = _cards.sumOf { it.tier.values }
59
+
60
+ fun add(card: TrumpCard) { _cards.add(card) }
61
+ fun hasAce(): Boolean = _cards.any { it.tier == CardTier.ACE }
62
+ fun size(): Int = _cards.size
63
+ }
64
+ ```
65
+
66
+ → **카드 책임 객체 분리** — reviewer (Thread 6) *"Participant가 하는 일이 다소 많아 보이네요..! 딜러, 참가자 모두 자신들의 카드를 들고 있으니 이 또한 객체로 취급해볼 수 있을까요?"* → 학생 자가 적용.
67
+
68
+ **god-object 회피 + 책임 분리** PR #145·#80·#76·#82·#107·#46·#16·#73·#36·#87 결.
69
+
70
+ 다만 **`val allCards: List<TrumpCard> get() = _cards.toList()` 외부 노출** + **`Participant.getAllCards(): List<TrumpCard> = cards.allCards`** = *2단계 위임 + 외부 노출* → §디미터 법칙 가능.
71
+
72
+ ### 5. `Participant abstract class` + Dealer/Player 추상 메서드 3개
73
+
74
+ ```kotlin
75
+ abstract class Participant(val cards: ParticipantCards) {
76
+ abstract fun showInitialCards(): List<TrumpCard>
77
+ abstract fun isDrawable(): Boolean
78
+ abstract fun getResult(other: Participant): GameResult
79
+
80
+ fun receiveCard(card: TrumpCard) { cards.add(card) }
81
+ fun isBust(extraScore: Int = ACE_HARD_SCORE): Boolean = cards.sumOfCards + extraScore > BUST_STANDARD
82
+ fun finalScore(): Int = ...
83
+ }
84
+ ```
85
+
86
+ → **추상 메서드 3종 + 공통 로직 finalScore/isBust/receiveCard** — *진정한 추상화*:
87
+
88
+ #### 5.1. *3 추상 메서드 = 다형성*
89
+
90
+ - `showInitialCards()`: *Dealer 1장 / Player 2장 (도메인 룰)*.
91
+ - `isDrawable()`: *Dealer 16 이하 / Player 21 이하 (도메인 룰)*.
92
+ - `getResult(other)`: *Dealer 관점 / Player 관점 (대칭 역방향)*.
93
+
94
+ 학생 자가 학습 (Thread 8·15·16): *abstract class 선택 + Dealer/Player 공통 로직 추출*.
95
+
96
+ #### 5.2. *공통 로직 finalScore/isBust/receiveCard = 부모 클래스*
97
+
98
+ 부모 클래스가 *공통 로직 보유 + 자식이 *추상 메서드* 만 차이*. **추상화 정공**.
99
+
100
+ PR #87·#36·#16·#73·#80·#82·#107 결.
101
+
102
+ ### 6. 카드 공개 (`showInitialCards`) = 비즈니스 로직 자가 이동
103
+
104
+ reviewer (Thread 13):
105
+
106
+ > *"이부분을 깊게 고민해볼 필요가 있어요 🧐 `딜러는 첫번째 카드를 공개해야 한다` 는 비즈니스 로직일까요 Controller 로직일까요? 참가자와 딜러가 `카드를 공개한다` 라는 공통 로직에 대해 지금까지 구현한 것 처럼 참가자와 딜러의 행동을 추상화가 가능할겁니다"*
107
+
108
+ 학생 자가 적용: *"카드를 N장 공개한다는 로직은 비즈니스 로직이라고 생각하여 Participant 내로 옮겼습니다! 첫 카드를 공개할 때 플레이어는 2장을, 딜러는 1장을 공개하도록 수정했습니다!"*
109
+
110
+ → **비즈니스 로직 vs Controller 로직 구분 + 자가 추상화** — *Controller 가 *Dealer.cards.take(1) + Player.cards.take(2)* 외부 처리 → *Participant.showInitialCards() 다형성*.
111
+
112
+ **MCP 룰 `business-logic-vs-controller-logic` 후보** — *비즈니스 vs 컨트롤러 위치 트레이드오프*.
113
+
114
+ ### 7. 추가 칭찬
115
+
116
+ - *Thread 4*: *"View로직을 갖지 않게 enum 을 잘 구성해주셨네요"* (Shape).
117
+ - *Thread 17*: *"고차함수 활용 👍"* (Player.choice).
118
+ - *Thread 19*: *"명시적인 테스트명과 세세하게 테스트를 항목을 구성해주셨네요 👍"*.
119
+ - *Thread 21*: *"추상화 👍"*.
120
+
121
+ ## 못한 점 (설계 관점)
122
+
123
+ ### 1. 딜러 여러 명 논리오류 + `first()` vs `single()` vs 생성자 타입 분리
124
+
125
+ reviewer (Thread 1·11):
126
+
127
+ > *"이렇게 되면 딜러가 여러명일 때 논리오류 대응이 가능할까요?"*
128
+
129
+ 학생 자가 답변:
130
+
131
+ > *"게임에서 딜러가 여러 명일 경우는 없을거라고 생각해서 다음과 같이 작성했었습니다…! 실제 게임에서는 딜러가 한 명이어도 만약의 경우를 생각해서 List<Dealer>로 코드를 작성하는게 좋을까요? 또, 이번에 이에 대해 고민해보면서 `first()` 대신 `single()`을 사용해서 딜러가 한 명인 것을 강제하고 그렇지 않을 때는 예외를 던지는 방법도 있다는 것을 알게 되었습니다."*
132
+
133
+ reviewer (Thread 11):
134
+
135
+ > *"지난 로또 미션에서도 로또 번호는 중복이 될 수 없기에 어떻게 처리를 해줘야 하는지 기억하시나요? 지금 구조에서는 그와 동일한 상황이라고 생각했어요!*
136
+ >
137
+ > *두가지 방법이 있을 것 같아요. - Paricipants 생성자에서 타입 분리(dealer, player) - 내부 프로퍼티에서 검증(예외던지기? singleOrNull?) 어느 방법이 좋을지 고민해보시고 알려주세요!"*
138
+
139
+ 학생 자가 적용: *생성자 타입 분리*.
140
+
141
+ → **invariant 강제 시점 3 가지**:
142
+
143
+ | 안 | 시점 | 장점 | 단점 |
144
+ |---|---|---|---|
145
+ | `List<Participant>.first()` (학생 초안) | *호출 시* | *간결* | *invariant 위반 시 silent + 의미 누수* |
146
+ | `List<Participant>.single()` | *호출 시 + 예외* | *invariant 명시 + 예외 던짐* | *런타임 검증 + 호출 매번 비용* |
147
+ | 생성자 타입 분리 (`Participants(dealer, players)`) | *컴파일 시* | *invariant 강제 + 호출자가 의미 알기 쉬움* | *Participant 추상화 일부 약화* |
148
+
149
+ → **MCP 룰 `compile-time-singleton-vs-runtime-filter` 후보** — *invariant 강제 시점 트레이드오프*. PR #79·#92·#48·#39 결의 *invariant 강제 시점*.
150
+
151
+ ### 2. ktlint 통과 X — 도구 안내
152
+
153
+ reviewer (Thread 2):
154
+
155
+ > *"ktlint 확인해주세요!"* (이미지 첨부)
156
+
157
+ 학생: *"넵 감사합니다!!"*
158
+
159
+ → **CI 도구 자가 점검**. PR #87 결 강화.
160
+
161
+ ### 3. `String` → `UserChoice` enum 반환
162
+
163
+ reviewer (Thread 3):
164
+
165
+ > *"String대신 UserChoice 를 반환하는건 어떨까요?"*
166
+
167
+ 학생 자가 적용.
168
+
169
+ → **Stringly-typed → enum 변환** — *컴파일러 강제 + 의미 명시*. PR #117·#20·#28·#125 결.
170
+
171
+ ### 4. `Players` 일급 컬렉션 + 자가 행동 — depth 깊이 분리
172
+
173
+ reviewer (Thread 5):
174
+
175
+ > *"현재 객체들을 잘 생성해주시고 분리를 해주셨는데 만약 Players 라는 일급컬렉션이 존재한다면 해당 객체 내에서 스스로 행동할 수 있지 않을까요?"*
176
+
177
+ 학생 자가 적용: *Participants 객체 생성 + 로직 분리*.
178
+
179
+ → **일급 컬렉션 = depth 분리 + Tell-Don't-Ask** — *playGame 함수 depth = Players/Participants 가 자가 처리*. PR #21·#74·#108·#46·#36·#117 결.
180
+
181
+ ### 5. 게임 승패 = 외부 장치 vs 참가자 자가 결정 — Tell-Don't-Ask + 현실 메타포
182
+
183
+ reviewer (Thread 7):
184
+
185
+ > *"게임의 승패를 결정해주는건 외부 장치가 해주는걸까요?*
186
+ > *실제 게임을 생각해보면, 외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다.*
187
+ > *`Participant 가 힌트가 되겠네요!`"*
188
+
189
+ 학생 자가 적용: *Player 로 승패 로직 이동* (다만 *Player 가 자가 결정 + Dealer 가 반대 받음* 자가 의문 발생).
190
+
191
+ reviewer 후속 (Thread 14):
192
+
193
+ > *"`내 점수와 상대 점수를 비교하여 결과를 판단한다`는 참가자와 딜러의 공통 로직입니다. 다만, 그 기준이 다를뿐일거에요. 지금까지 추상화를 진행한 이유에 대해 고민해보시죠!*
194
+ >
195
+ > *추상화를 진행하게 된다면 Controller입장에서는 `Participant` 가 참가자인지, 딜러인지 알 필요없이 `Participant` 에게 결과를 판단하라고 메세지만 던지면 됩니다"*
196
+
197
+ 학생 자가 적용: *각각 참가자가 승패를 계산* (Dealer.getResult / Player.getResult 추상 메서드).
198
+
199
+ → **Tell-Don't-Ask + 현실 메타포 + 추상화 활용 점검**:
200
+
201
+ #### 5.1. *3 단계 학습*
202
+
203
+ 1. **외부 장치 (GameResultDecider) → Player 로 이동** (학생 1차 자가 적용).
204
+ 2. **Player 만 자가 결정 + Dealer 반대 받음 → 복잡 자가 의문**.
205
+ 3. **Player + Dealer 모두 자가 결정 (`Participant.getResult` 추상)** (학생 2차 자가 적용).
206
+
207
+ #### 5.2. *현실 메타포 어휘*
208
+
209
+ reviewer *"외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다"* = **현실 메타포 정합**. PR #117·#31·#21 결.
210
+
211
+ **MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ — 누적 9+ PR.
212
+
213
+ #### 5.3. *추상화 활용 점검 어휘*
214
+
215
+ reviewer *"지금까지 추상화를 진행한 이유에 대해 고민해보시죠!"* = **학습 의도 회수 어휘**.
216
+
217
+ **MCP 룰 `abstraction-purpose-revisit` 후보** — *추상화를 진행한 이유 회수*.
218
+
219
+ ### 6. `sealed interface vs abstract class vs open class` — Kotlin 어휘
220
+
221
+ reviewer (Thread 8):
222
+
223
+ > *"- sealed interface*
224
+ > *- abstract class*
225
+ > *- open class*
226
+ > *이 세가지의 차이점과 용도는 어떻게 될까요? 고민해보시고 블랙잭 미션에서는 어떤 키워드가 어울릴지 고민해보시고 저에게도 공유해주세요!"*
227
+
228
+ 학생 자가 답변:
229
+
230
+ > *"abstract class와 sealed interface 모두 추상화를 제공하지만, abstract class는 공통된 로직을 미리 구현하여 하위 클래스에서 재사용할 수 있도록 강제하는 반면, interface는 구현해야 할 틀만 제공하고, 모든 로직을 하위 클래스에서 직접 작성해야 한다는 차이가 있습니다. open class는 일반 클래스를 어디서든 상속 가능하도록 하지만 그렇기 때문에 의도를 잘못 이해했다면 잘못된 방식으로 기능이 변경될 위험이 있다고 알고 있습니다."*
231
+
232
+ → **Kotlin 어휘 3 가지 트레이드오프**:
233
+
234
+ | 키워드 | 의도 | 적합 시점 |
235
+ |---|---|---|
236
+ | `sealed interface` | *알려진 자식 한정 + 다형성 분기 (when exhaustive)* | *자식이 한정 + 상태/이벤트 표현* (Bust/Normal/Blackjack 같은 State) |
237
+ | `abstract class` | *공통 로직 + 추상 메서드* | *자식 공통 로직 + 차이는 추상 메서드 (Participant)* |
238
+ | `open class` | *상속 허용 (의도 약함)* | *드물게 사용 + Java 호환* |
239
+
240
+ 학생 최종 선택: **`abstract class Participant`** — *공통 로직 (finalScore, isBust, receiveCard) + 추상 메서드 (showInitialCards, isDrawable, getResult)*. **정확한 의도 매핑**.
241
+
242
+ **MCP 룰 `sealed-vs-abstract-vs-open-locator` 후보** — *Kotlin 키워드 선택 트레이드오프*. PR #98·#36·#147·#93·#136 결의 *sealed vs enum vs abstract* 변형.
243
+
244
+ ### 7. `Deck` 테스트 가능성 + `interface` 분리
245
+
246
+ reviewer (Thread 9):
247
+
248
+ > *"현재 Deck의 비즈니스 로직은 테스트가 가능할까요? 예를 들어, `특정 순서의 카드의 덱에서 순서대로 뽑으면 의도한 카드가 나와야한다` 를 테스트가 가능할까요?"*
249
+
250
+ 학생 자가 답변: *"전부 private으로 처리되어 있어서 테스트가 불가하네요... interface로 랜덤으로 섞인 카드와 테스트용으로 순서대로 카드 뭉치를 생성하도록 하여 테스트가 가능하도록 했습니다!"*
251
+
252
+ → **테스트 가능성 = 객체 설계 지표** (PR #87 *테스트 = 객체 설계 명세서* 결 강화):
253
+
254
+ #### 7.1. *Deck = interface 분리*
255
+
256
+ ```kotlin
257
+ interface Deck { fun pop(): TrumpCard }
258
+ class RandomDeck : Deck { ... } // production
259
+ class FixedDeck : Deck { ... } // test (순서대로)
260
+ ```
261
+
262
+ → **테스트 가능성을 위한 interface 분리** + **production vs test 의 별도 구현**. *의존성 역전 (DIP)*.
263
+
264
+ **MCP 룰 `interface-for-test-substitution` 후보** — *테스트 가능성을 위한 interface 분리*. 누적 4+ PR.
265
+
266
+ #### 7.2. *Singleton Deck 회피 vs interface 분리 양가*
267
+
268
+ PR #20·#28·#125·#65·#92·#108 결의 *Singleton Deck (companion object MutableSet)* 안티패턴 회피 → *interface + DI 정공*.
269
+
270
+ ### 8. `if (names.contains(EMPTY))` true/false 의미 → 직관 로직
271
+
272
+ reviewer (Thread 10):
273
+
274
+ > *"비비의 의도는 함수를 사용해 가독성을 높이는걸로 이해했는데요, 해당 함수가 갖는 true/false의 의미를 찾기보다 직관적으로 이해할 수 있게 로직 구성도 가능합니다!"*
275
+
276
+ 학생 자가 적용 + 자가 후속 의문 (검증 코드 함수 분리 vs require + 줄글 vs 핵심).
277
+
278
+ reviewer 후속 답변:
279
+
280
+ > *"- 검증코드를 함수로 분리하는게 좋을지?*
281
+ > *- 도메인에서 검증할 때 require 로 검증할지? or 함수로 분리할지?*
282
+ > *로 정리가 될 것 같은데요 🥲*
283
+ > *일단, 첫번째 질문은 함수를 읽을 때 내부 구현까지 알 필요가 없다면 직관성이 좋은 함수로 분리하는게 좋다고 생각해요. 사실 내부에서 어떤 규칙으로 검증하는지 까진 관심이 없어도 된다면, 함수로 ~~검증을 한다 정도만 알려줘도 무방하기 때문입니다.*
284
+ >
285
+ > *두번째는 require 에서 검증할 때는 로직의 복잡도에 따라 다를 것 같은데요, 굳이 함수로 분리해야 하나? 싶기도 합니다. 보통 require에서는 하나의 로직에 대해 검증하기에 여러 로직이 합쳐지지 않을거라고 생각되네요"*
286
+
287
+ → **검증 코드 분리 트레이드오프 + 도메인 require 어휘**:
288
+
289
+ #### 8.1. *검증 함수 분리 시점*
290
+
291
+ - 함수 분리: *내부 구현 알 필요 X + 의도 명시* (예: `validateNonEmpty(names)`).
292
+ - inline: *간결 + 로직 1 가지만 + require 자가 적용*.
293
+
294
+ #### 8.2. *Boolean 함수명 = true/false 의미*
295
+
296
+ 학생 초안 (예시):
297
+ ```kotlin
298
+ if (validateNames(names)) {
299
+ return names
300
+ }
301
+ ```
302
+
303
+ → *`validateNames` 가 true/false 어느 것을 의미? = 가독성 모호*. **MCP 룰 `boolean-function-name-ambiguity` 후보** — *Boolean 함수명 = true/false 의미 명시*.
304
+
305
+ ### 9. 커뮤니케이션 메타 (줄글 vs 핵심 내용) — reviewer 메타 어휘
306
+
307
+ reviewer (Thread 10 후속):
308
+
309
+ > *"조금 도움이 되었으면 하는 마음에 조심스럽게 말씀드려봅니다 🙃*
310
+ > *우테코 미션을 진행하는 것을 넘어 이후 현업에서도 커뮤니케이션 비용 줄이기에 대해 많은 사람들이 고민을 하는데요.*
311
+ > *예를 들어, 비비가 주신 질문을 줄글로 주셔도 좋지만, 핵심 내용을 간략하게 전달하는 것 또한 중요하다고 생각해요.*
312
+ > *앞으로 리뷰어들과 많은 소통을 하실 때 이부분도 함께 고려하신다면 비비의 커뮤니케이션 능력 또한 향상될겁니다!"*
313
+
314
+ 학생: *"앞으로의 리뷰에서 피드백 주신 점 반영하여 핵심 내용을 보기 좋게 적어보도록 하겠습니다!"*
315
+
316
+ → **reviewer 가 커뮤니케이션 메타 어휘 명시** = *코드 외 학습 영역 + 학생 미래 커리어 의식*. **MCP `oh-my-oop` 핵심 가치 합류 (커뮤니케이션 비용)**.
317
+
318
+ PR #87 *"동료 개발자가 이런 부분을 궁금해할 수도 있구나"* 결 + PR #76·#80·#107 결의 *동료 개발자 시점* 어휘 합류.
319
+
320
+ ### 10. `참가자는 본인 스스로 Hit 가능한지 알 수 있다` — 추상화 활용 점검
321
+
322
+ reviewer (Thread 15):
323
+
324
+ > *"`참가자는 본인 스스로 Hit 가능한지 알 수 있다` 는 Player, Dealer 의 공통 사항이 아닐까요? 단지 Hitable 한지 기준이 다를뿐입니다. 추상화 활용에 대해 고민해보시죠 🧐"*
325
+
326
+ 학생 자가 적용 (`isDrawable` 추상 메서드 추가):
327
+
328
+ ```kotlin
329
+ abstract class Participant {
330
+ abstract fun isDrawable(): Boolean
331
+ }
332
+
333
+ class Dealer : Participant {
334
+ override fun isDrawable(): Boolean = ... // 16 이하
335
+ }
336
+
337
+ class Player : Participant {
338
+ override fun isDrawable(): Boolean = ... // 21 이하
339
+ }
340
+ ```
341
+
342
+ 학생 자가 깨달음: *"플레이어의 hitable 여부는 `isBust`가 아니라 `!isBust`여서 사용되는 방식이 아예 반대라는 것을 알았습니다... 시간에 쫓겨 작업하느라 미처 확인하지 못한 부분이었던 것 같아요…"*
343
+
344
+ → **추상화 활용 = 공통 사항 → 추상 메서드** + **학생 자가 한계 인정** (시간 압박 인정).
345
+
346
+ **MCP 룰 `abstraction-as-shared-behavior-discovery` 후보** — *공통 사항 → 추상 메서드 변환*.
347
+
348
+ ### 11. `open class` vs `abstract class` 의미 점검 (추상 메서드 없을 시)
349
+
350
+ reviewer (Thread 16):
351
+
352
+ > *"`Dealer, Player` 클래스 의 코멘트들과 이어지는 코멘트입니다.*
353
+ > *현재 구조에서 open class 로 선언해도 달라지는게 없는 이유가 무엇일까요?"*
354
+
355
+ 학생 자가 답변:
356
+
357
+ > *"현재 Participant는 추상 메서드를 포함하고 있지 않아 추상화는 이루어지지 않고, 단순히 공통된 로직을 플레이어와 딜러에서 재사용하도록 만든 구조이기 때문에 실질적으로는 open class로 선언한 것과 다른게 없는 것 같아요...!*
358
+ >
359
+ > *로직 중 추상화를 통해 가지고 있을 수 있는 부분이 충분히 많은데도 잘 활용하고 있지 못했던 것 같습니다. 이 부분을 abstract class를 좀 더 활용할 수 있도록 이번 리뷰들을 반영하여 수정했습니다!"*
360
+
361
+ → **`abstract class` vs `open class` = 추상 메서드 유무**. *추상 메서드 없는 abstract class = open class 와 사실상 동치*.
362
+
363
+ **Kotlin 어휘 깊은 학생 자가 깨달음**. PR #117 *property val vs computed property* 결의 *Kotlin 어휘 자가 학습* 변형.
364
+
365
+ **MCP 룰 `abstract-without-abstract-method` 강화** — 누적 5+ PR (#95·#36·#117·#129·#147).
366
+
367
+ ### 12. `Deck.pop` 예외 처리 — 게임 종료 흐름
368
+
369
+ reviewer (Thread 20):
370
+
371
+ > *"그럴 확률은 적겠지만, 만약 더이상 카드를 뽑지 못한다면 Exception이 발생하여 프로그램이 그대로 종료될거에요. 현실에서 게임을 구현한다면 게임을 끝내 중간 결과를 출력하거나, 안내문구를 출력하고 프로그램을 로직상 종료하는 흐름은 어떨까요?"*
372
+
373
+ reviewer 후속:
374
+
375
+ > *"`deck.pop` 로직을 수정하라는게 아닌, 이 함수를 호출할 때 어떤점을 고려해야 하는지에 대해 고민해보셨으면 합니다 :)"*
376
+
377
+ → **예외 처리 vs 로직 종료 흐름** — *Exception 던지기 = 프로그램 종료* vs *Exception 잡아서 게임 끝내 + 안내문구*. **MCP 룰 `exception-vs-graceful-shutdown` 후보**.
378
+
379
+ ### 13. `Player.allCards 에 직접 접근` — Tell-Don't-Ask
380
+
381
+ reviewer (Thread 18):
382
+
383
+ > *"allCards 에 직접 접근하기보다 `참가자의 덱에서 몇장 꺼내올 수 있다` 로직을 수행해보는건 어떨까요?"*
384
+
385
+ → **Tell-Don't-Ask** — *Participant.cards.allCards.take(N) 외부 처리* → *Participant.takeFirstN(n: Int) 메시지*. **MCP 룰 `external-take-vs-domain-method` 후보**.
386
+
387
+ 다만 *`showInitialCards()` 자가 적용* (Player 2장 / Dealer 1장) = *이미 정공*. reviewer 의 *추가 시점*.
388
+
389
+ ### 14. `Dealer.isDrawable()` `Player.isDrawable()` 의미 반대 — 추상화 의도 약함
390
+
391
+ ```kotlin
392
+ // Dealer.isDrawable() = sum < 16 (draw 가능 = 16 미만)
393
+ // Player.isDrawable() = sum <= 21 (draw 가능 = 21 이하)
394
+ ```
395
+
396
+ → *조건 의미는 *공통: hit 가능 시 true* + *기준만 차이*. 다만 **`isDrawable` 와 `!isBust` 양가성**:
397
+
398
+ - Dealer.isDrawable() ≠ !isBust() (16 < score ≤ 21 도 isBust X, isDrawable X).
399
+ - Player.isDrawable() ≈ !isBust() (소프트 21 한정).
400
+
401
+ 학생 자가 깨달음 (Thread 15) = *Player.isDrawable = !isBust ≠ isBust*. **이름과 의미 일관성**.
402
+
403
+ PR #117 (isHit → canHit) 결의 *이름 의미 정확성* 변형.
404
+
405
+ ### 15. `Dealer.getResult` vs `Player.getResult` — 대칭 코드 + 양방향 호출 위험
406
+
407
+ ```kotlin
408
+ // Player.getResult(other: Participant): GameResult
409
+ override fun getResult(other: Participant): GameResult = when {
410
+ this.isBust() -> GameResult.LOSE
411
+ other.isBust() && !this.isBust() -> GameResult.WIN
412
+ myScore > otherScore -> GameResult.WIN
413
+ ...
414
+ }
415
+
416
+ // Dealer.getResult(other: Participant): GameResult
417
+ override fun getResult(other: Participant): GameResult = when {
418
+ other.isBust() -> GameResult.WIN
419
+ this.isBust() && !other.isBust() -> GameResult.LOSE
420
+ ...
421
+ }
422
+ ```
423
+
424
+ → **대칭 코드 = Dealer 와 Player 각자 *자가 결정***. 다만 **`isBust` 양가성**:
425
+
426
+ - Dealer.getResult(player): *other (Player) isBust → Dealer WIN*.
427
+ - Player.getResult(dealer): *other (Dealer) isBust + !this.isBust → Player WIN*.
428
+
429
+ → *각자 자가 결정 = Tell-Don't-Ask 정공*. 다만 *`participant1.getResult(participant2)` 와 `participant2.getResult(participant1)` 양방향 호출 가능* → *항상 부호 반전 인지 필요*.
430
+
431
+ 대안: **`Participant.compareWith(other): GameResult`** 추상 + *부호 반전 1 자리* (PR #36 `operator fun not()` 결).
432
+
433
+ **MCP 룰 `symmetric-getResult-vs-compareWith` 후보**.
434
+
435
+ ### 16. 결과 계산 책임 + 현실 메타포 (학생 자가 의문)
436
+
437
+ 학생 자가 의문 (Thread 22):
438
+
439
+ > *"그래서 관련 로직을 또 다른 객체로 분리하여 (예를 들면 결과 로직을 모아서 resultCalculator) 가지게 하는게 좋을까? 하는 고민을 했었습니다. 이에 대해 제이든은 어떻게 생각하시는지 궁금합니다!"*
440
+
441
+ reviewer:
442
+
443
+ > *"결국에 결과를 계산하는건 누구의 역할일까? 를 고민해보시면 좋을 것 같아요. 또한, 현실세계에 도입해서 블랙잭 게임을 할 때 외부 장치로 결과를 계산하는가를 생각해보셔도 좋습니다. 충분히 고민해보시고 해결이 안되는 부분이 있다면 말씀주세요 :)"*
444
+
445
+ → **현실 메타포 + 학생 자가 학습 권유** — *§5 결의 *외부 장치 X = 참가자 자가 결정* 일관*. **MCP `oh-my-oop` 핵심 가치 합류 정점**.
446
+
447
+ ### 17. `BlackJackGame.calculateDealerResult` + `calculatePlayerResult` Controller-like 누수
448
+
449
+ ```kotlin
450
+ fun calculateDealerResult(action: (Map<GameResult, Int>) -> Unit) {
451
+ val dealerMap = GameResult.entries.associateWith { 0 }.toMutableMap()
452
+ participants.players.forEach { player ->
453
+ val result = participants.dealer.getResult(player)
454
+ dealerMap[result] = dealerMap.getOrDefault(result, 0) + 1
455
+ }
456
+ action(dealerMap)
457
+ }
458
+ ```
459
+
460
+ → **BlackJackGame 이 `Map<GameResult, Int>` 누적 + 외부 action 호출** = *callback 람다 = View 결합* (PR #36·#137 결).
461
+
462
+ 대안: **`Participants.calculateDealerResults(): Map<GameResult, Int>` 메서드 + Controller 가 결과 받아서 View 처리** — *callback 람다 X*.
463
+
464
+ **MCP 룰 `callback-action-for-result-aggregation` 후보** — *결과 누적 callback vs return*. PR #36 (callback-lambda-view-cost) 결.
465
+
466
+ ### 18. `processDealerTurn(): Int` `count` 반환 — 의미 모호
467
+
468
+ ```kotlin
469
+ fun processDealerTurn(): Int {
470
+ var count = 0
471
+ while (participants.dealer.isDrawable()) {
472
+ participants.dealer.receiveCard(deck.pop())
473
+ count++
474
+ }
475
+ return count
476
+ }
477
+ ```
478
+
479
+ → **`Int` 반환 = 의미 모호**. *processDealerTurn 의 결과가 *카드 뽑은 횟수* 임을 인지 어려움*.
480
+
481
+ 대안:
482
+ - `data class DealerTurnResult(val drawCount: Int)`.
483
+ - `fun processDealerTurn(onDrawn: () -> Unit)` (callback).
484
+
485
+ **MCP 룰 `primitive-return-without-domain-meaning` 후보** — *원시 타입 반환 = 의미 누수*. PR #36·#21 결.
486
+
487
+ ### 19. `BlackJackGame.handOutInitializedCards(initializedCardCount: Int = INITIAL_CARD_COUNT)` 기본 인자 양가
488
+
489
+ ```kotlin
490
+ fun handOutInitializedCards(initializedCardCount: Int = INITIAL_CARD_COUNT) {
491
+ (participants.players + participants.dealer).forEach { player ->
492
+ repeat(initializedCardCount) { player.receiveCard(deck.pop()) }
493
+ }
494
+ }
495
+ ```
496
+
497
+ → **기본 인자 + 호출 시 외부 인자 (테스트 한정?)** = *production 호출 시 인자 생략 + 테스트 시 인자 전달*. **production vs test 의 양방향 인터페이스**.
498
+
499
+ 다만 *Dealer 도 2장 받음* = *Dealer 의 도메인 룰 = 첫 카드만 공개 (showInitialCards)* 의 *카드 수신 = 모두 2장* 와 *공개 = 1장* 분리.
500
+
501
+ 학생의 분리 시점:
502
+ - 카드 수신: 모두 2장 (`handOutInitializedCards`).
503
+ - 공개: Dealer 1장 / Player 2장 (`showInitialCards`).
504
+
505
+ → **수신 vs 공개 분리 = 도메인 룰 정확**. PR #117 결의 *카드뭉치에서 꺼내서 플레이어 받는다* 결.
506
+
507
+ ### 20. `Dealer.DEALER_MAX_SCORE = 16` — 16 매직 넘버 회피
508
+
509
+ ```kotlin
510
+ companion object {
511
+ private const val DEALER_MAX_SCORE = 16
512
+ private const val DEALER_INITIAL_CARD_COUNT = 1
513
+ }
514
+ ```
515
+
516
+ → **매직 넘버 16 → 상수 명명**. PR #117 (DEALER_HIT_LIMIT) 결.
517
+
518
+ 다만 *`DEALER_MAX_SCORE = 16` 명명 양가* = *Dealer 최대 점수 = 16? Dealer hit 한계 = 16?*. **이름 의미 정확성**:
519
+
520
+ - `DEALER_HIT_THRESHOLD = 16` (16 이하 hit).
521
+ - `DEALER_STAY_THRESHOLD = 17` (17 이상 stay).
522
+
523
+ 학생의 `<` 비교 (`cards.sumOfCards < DEALER_MAX_SCORE`) = *16 미만 hit* → *17 = stay* (블랙잭 룰).
524
+
525
+ 다만 `<` 시 *16 시 stay* → *블랙잭 룰 = 16 시 hit 인지 stay 인지 도메인 확인 필요*.
526
+
527
+ **블랙잭 표준 룰**: Dealer 16 이하 hit (16 시 hit). → 학생 코드 `cards.sumOfCards < 16` 시 *16 시 hit X = 룰 와전*.
528
+
529
+ → **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** — *< vs ≤ 점검*. 누적 10+ PR ⭐⭐⭐.
530
+
531
+ ### 21. `Participant.finalScore` Ace Soft 1↔11 — 단일 +10 룰 (PR #36 결)
532
+
533
+ ```kotlin
534
+ fun finalScore(): Int =
535
+ if (cards.hasAce() && !isBust(ACE_SOFT_SCORE)) {
536
+ cards.sumOfCards + ACE_SOFT_SCORE
537
+ } else {
538
+ cards.sumOfCards
539
+ }
540
+ ```
541
+
542
+ → **Ace 1 기본 + 단일 +10 룰** (PR #36 결의 *단일 +10*).
543
+
544
+ **Ace 2장 이상 처리 X** — *Ace 1장 = 1+10=11, Ace 2장 모두 11 시 22 > 21 = soft Ace 적용 X (단일 +10)*.
545
+
546
+ PR #117 (수학적 풀이) 결의 *Multi-Ace 정확 처리* vs 현재 안 *단일 +10*. **트레이드오프**:
547
+
548
+ | 안 | 장점 | 단점 |
549
+ |---|---|---|
550
+ | 단일 +10 (현재) | *간결 + Ace 1장 한정 정확* | *Ace 2장 이상 정확 X* |
551
+ | Multi-Ace 수학적 (PR #117 후속) | *모든 Ace 정확* | *공식 복잡* |
552
+ | while + 차감 (안티패턴) | *Multi-Ace OK* | *반복문 의존* |
553
+
554
+ **MCP 룰 `ace-bonus-single-vs-multi` 강화** — 누적 2+ PR (#36·#129).
555
+
556
+ ### 22. `Participants` `getChoice(deck, getPlayerChoice, onPlayerStateUpdated)` 람다 2개
557
+
558
+ ```kotlin
559
+ fun getChoice(
560
+ deck: Deck,
561
+ getPlayerChoice: (String) -> Boolean,
562
+ onPlayerStateUpdated: (Player) -> Unit,
563
+ ) {
564
+ players.forEach { player -> player.choice(deck, getPlayerChoice, onPlayerStateUpdated) }
565
+ }
566
+ ```
567
+
568
+ → **콜백 람다 2개 = call site 인지 부담 ↑** (PR #36 결).
569
+
570
+ 다만 *Participants.getChoice = 단순 위임 (player.choice 호출)* = *추가 책임 없음*. **MCP 룰 `simple-delegation-method-unnecessary` 후보** — *단순 위임 메서드 = 추가 책임 X = 메서드 인공*.
571
+
572
+ PR #87 (Participant.getName, getCards 위임 6 개) 결 동일.
573
+
574
+ ## 리뷰어 의견 요지
575
+
576
+ - **현실 메타포 = 게임 승패 외부 장치 X, 참가자 자가 결정** — *Tell-Don't-Ask + 현실 정합*.
577
+ - **추상화 활용 점검 = 공통 사항 + 기준 다름** — *지금까지 추상화를 진행한 이유 회수*.
578
+ - **딜러 여러 명 논리오류 + invariant 강제 시점 3 안** — *first / single / 생성자 타입 분리*.
579
+ - **sealed interface vs abstract class vs open class** — *Kotlin 어휘 자가 학습*.
580
+ - **Deck 테스트 가능성 + interface 분리** — *DIP*.
581
+ - **검증 코드 함수 분리 vs require 트레이드오프** — *내부 구현 알 필요 X 시 함수 분리*.
582
+ - **커뮤니케이션 메타 (줄글 vs 핵심 내용)** — *코드 외 학습 영역 + 학생 미래 커리어 의식*.
583
+ - **카드 공개 = 비즈니스 로직 vs Controller 로직** — *Participant 내로 이동 + 다형성*.
584
+ - **deck.pop 예외 처리 = 게임 종료 흐름** — *프로그램 종료 vs 안내문구 후 종료*.
585
+ - **`if (validateNames)` true/false 의미** → *직관 로직*.
586
+ - **Participants 생성자 프로퍼티 유의미 사용 점검** — *불필요한 변수 자가 깨달음*.
587
+ - **`open class` = abstract method 없는 abstract class 동치 점검** — *Kotlin 어휘 학생 자가 학습*.
588
+ - **`Player.allCards` 직접 접근 → `takeFirstN` 메시지** — *Tell-Don't-Ask*.
589
+ - **이미 칭찬한 부분** — View 로직 없는 enum / 고차함수 활용 / 명시적 테스트명 / 추상화.
590
+
591
+ ## 대표 인용
592
+
593
+ > [KwonDae]
594
+ > *"게임의 승패를 결정해주는건 외부 장치가 해주는걸까요? 실제 게임을 생각해보면, 외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다."*
595
+
596
+ → **현실 메타포 + Tell-Don't-Ask 어휘**. PR #117·#31·#21 결.
597
+
598
+ > [KwonDae]
599
+ > *"`내 점수와 상대 점수를 비교하여 결과를 판단한다`는 참가자와 딜러의 공통 로직입니다. 다만, 그 기준이 다를뿐일거에요. 지금까지 추상화를 진행한 이유에 대해 고민해보시죠!*
600
+ >
601
+ > *추상화를 진행하게 된다면 Controller입장에서는 `Participant` 가 참가자인지, 딜러인지 알 필요없이 `Participant` 에게 결과를 판단하라고 메세지만 던지면 됩니다"*
602
+
603
+ → **추상화 활용 점검 + 학습 의도 회수** 어휘. **MCP `oop_propose_alternatives` 핵심 가치 합류**.
604
+
605
+ > [KwonDae]
606
+ > *"우테코 미션을 진행하는 것을 넘어 이후 현업에서도 커뮤니케이션 비용 줄이기에 대해 많은 사람들이 고민을 하는데요. 예를 들어, 비비가 주신 질문을 줄글로 주셔도 좋지만, 핵심 내용을 간략하게 전달하는 것 또한 중요하다고 생각해요."*
607
+
608
+ → **커뮤니케이션 메타 어휘** — *코드 외 학습 영역 + 학생 미래 커리어 의식*.
609
+
610
+ > [KwonDae]
611
+ > *"두가지 방법이 있을 것 같아요. - Paricipants 생성자에서 타입 분리(dealer, player) - 내부 프로퍼티에서 검증(예외던지기? singleOrNull?) 어느 방법이 좋을지 고민해보시고 알려주세요!"*
612
+
613
+ → **N 안 + 학생 선택지** 어휘. **MCP `oop_propose_alternatives` 핵심 가치 합류**.
614
+
615
+ > [rosemin928 자가 답변]
616
+ > *"플레이어의 hitable 여부는 `isBust`가 아니라 `!isBust`여서 사용되는 방식이 아예 반대라는 것을 알았습니다... 시간에 쫓겨 작업하느라 미처 확인하지 못한 부분이었던 것 같아요…"*
617
+
618
+ → **학생 자가 한계 인정 (시간 압박) + 자가 깨달음** — *학습 적극성*. PR #36·#87·#117 결.
619
+
620
+ > [KwonDae]
621
+ > *"`deck.pop` 로직을 수정하라는게 아닌, 이 함수를 호출할 때 어떤점을 고려해야 하는지에 대해 고민해보셨으면 합니다 :)"*
622
+
623
+ → **reviewer 의도 명시 + 학생 자가 학습 권유** 어휘.
624
+
625
+ > [KwonDae]
626
+ > *"아니요 절대 죄송하지 않으셔야 합니다 ㅎㅎ 잘 진행해주고 계셔서 조금이라도 도움이 되었으면 하는 마음이었다는것만 알아주세요!"*
627
+
628
+ → **reviewer 의 인간적 학생 격려** 어휘.
629
+
630
+ ## 얻은 교훈 (보편)
631
+
632
+ 1. **현실 메타포 = 게임 승패 외부 장치 X = 참가자 자가 결정** — *Tell-Don't-Ask + 현실 정합*. **MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ 누적 9+ PR.
633
+
634
+ 2. **추상화 활용 점검 = 공통 사항 → 추상 메서드** — *공통 사항 + 기준 다름 = 추상화 패턴*. **MCP 룰 `abstraction-as-shared-behavior-discovery` 후보**.
635
+
636
+ 3. **추상화 진행 이유 회수** — *"지금까지 추상화를 진행한 이유에 대해 고민해보시죠!"* = *학습 의도 회수 어휘*. **MCP 룰 `abstraction-purpose-revisit` 후보**.
637
+
638
+ 4. **invariant 강제 시점 3 안 (compile vs runtime vs filter)** — *생성자 타입 분리 vs single() vs filter().first()*. **MCP 룰 `compile-time-singleton-vs-runtime-filter` 후보**.
639
+
640
+ 5. **sealed interface vs abstract class vs open class** — *Kotlin 어휘 트레이드오프*. **MCP 룰 `sealed-vs-abstract-vs-open-locator` 후보**.
641
+
642
+ 6. **`abstract class` vs `open class` = 추상 메서드 유무** — *추상 메서드 없는 abstract = open 동치*. **MCP 룰 `abstract-without-abstract-method` 강화** 누적 5+ PR.
643
+
644
+ 7. **테스트 가능성 = 객체 설계 지표 + interface 분리 (DIP)** — *production vs test 의 별도 구현*. **MCP 룰 `interface-for-test-substitution` 후보**.
645
+
646
+ 8. **검증 코드 함수 분리 vs require 트레이드오프** — *내부 구현 알 필요 X 시 함수 분리*. **MCP 룰 `validation-function-vs-require-inline` 후보**.
647
+
648
+ 9. **커뮤니케이션 메타 (줄글 vs 핵심 내용)** — *코드 외 학습 영역 + 학생 미래 커리어 의식*. **MCP 핵심 가치 합류**.
649
+
650
+ 10. **비즈니스 로직 vs Controller 로직 구분** — *카드 공개 = 비즈니스 (참가자 다형성)*. **MCP 룰 `business-logic-vs-controller-logic` 후보**.
651
+
652
+ 11. **예외 처리 vs 게임 종료 흐름** — *Exception 던지기 vs graceful shutdown*. **MCP 룰 `exception-vs-graceful-shutdown` 후보**.
653
+
654
+ 12. **Boolean 함수명 = true/false 의미 명시** — *validateNames true/false 모호*. **MCP 룰 `boolean-function-name-ambiguity` 후보**.
655
+
656
+ 13. **외부 take vs 도메인 메서드** — *cards.allCards.take(N) → takeFirstN(n) 메시지*. **MCP 룰 `external-take-vs-domain-method` 후보**.
657
+
658
+ 14. **대칭 getResult vs compareWith** — *각자 자가 결정 (대칭 코드) vs 한 자리에서 비교*. **MCP 룰 `symmetric-getResult-vs-compareWith` 후보**.
659
+
660
+ 15. **모든 22 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 5+ 회** — *학생 자가 학습 가시화 정점*.
661
+
662
+ 16. **2025 코호트 스타일 (셀프 체크리스트 + 집중 리뷰 영역 자가 명시)** — PR #117·#129 합류.
663
+
664
+ 17. **학생 자가 한계 인정 (시간 압박)** — *시간에 쫓겨 미처 확인 못 함*. *학습 적극성*. 누적 10+ PR.
665
+
666
+ 18. **단순 위임 메서드 = 추가 책임 X = 메서드 인공** — *Participants.getChoice = player.choice 단순 호출*. **MCP 룰 `simple-delegation-method-unnecessary` 후보**.
667
+
668
+ 19. **결과 누적 callback vs return** — *callback action(map) vs return map*. **MCP 룰 `callback-action-for-result-aggregation` 후보**.
669
+
670
+ 20. **원시 타입 반환 (Int) = 의미 누수** — *processDealerTurn(): Int = drawCount 의미 모호*. **MCP 룰 `primitive-return-without-domain-meaning` 후보**.
671
+
672
+ ## 얻은 교훈 (도메인)
673
+
674
+ 1. **Dealer 1장 / Player 2장 카드 공개 도메인 룰** — *showInitialCards 다형성*.
675
+
676
+ 2. **Dealer 16 이하 hit / Player 21 이하 hit** — *Hit 가능 기준 차이 = 추상 메서드 isDrawable*.
677
+
678
+ 3. **카드 수신 vs 공개 분리** — *수신은 모두 2장, 공개는 Dealer 1장 / Player 2장*.
679
+
680
+ 4. **Ace 1 기본 + 단일 +10 룰** — PR #36 결. *Multi-Ace 정확 처리 X*.
681
+
682
+ 5. **`Dealer.isDrawable() = sum + 10 < 16` (Ace Soft 적용)** — *Soft Ace + 16 한계*. 다만 *블랙잭 표준은 17 이상 stay → < 17 또는 ≤ 16 hit*.
683
+
684
+ → **`DEALER_MAX_SCORE = 16` + `<` 비교 시 16 시 stay = 룰 와전 가능**. **블랙잭 룰 정확성 점검 필요**. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 10+ PR ⭐⭐⭐.
685
+
686
+ 6. **게임 승패 = 참가자 자가 결정 (외부 GameResultDecider X)** — *Tell-Don't-Ask + 현실 메타포*.
687
+
688
+ 7. **GameResult enum (WIN/LOSE/DRAW)** — *블랙잭 1.5배 분기 X (이번 미션 1단계)*.
689
+
690
+ ## MCP 룰 후보 신규 + 강화 (PR #129)
691
+
692
+ | 룰 | 신규 / 강화 | 누적 PR |
693
+ |---|---|---|
694
+ | `metaphor-fidelity-locator` | 강화 | 9+ ⭐⭐⭐ |
695
+ | `abstraction-as-shared-behavior-discovery` | 신규 | 1 (#129) |
696
+ | `abstraction-purpose-revisit` | 신규 | 1 (#129) |
697
+ | `compile-time-singleton-vs-runtime-filter` | 신규 | 4+ (#129·#79·#92·#48) |
698
+ | `sealed-vs-abstract-vs-open-locator` | 신규 | 5+ (#129·#98·#36·#147·#93·#136) |
699
+ | `abstract-without-abstract-method` | 강화 | 5+ (#95·#36·#117·#129·#147) |
700
+ | `interface-for-test-substitution` | 신규 | 4+ (#129·#48·#39·#46) |
701
+ | `validation-function-vs-require-inline` | 신규 | 1 (#129) |
702
+ | `business-logic-vs-controller-logic` | 신규 | 2+ (#129·#129) |
703
+ | `exception-vs-graceful-shutdown` | 신규 | 1 (#129) |
704
+ | `boolean-function-name-ambiguity` | 신규 | 1 (#129) |
705
+ | `external-take-vs-domain-method` | 신규 | 1 (#129) |
706
+ | `symmetric-getResult-vs-compareWith` | 신규 | 1 (#129) |
707
+ | `simple-delegation-method-unnecessary` | 신규 | 2+ (#129·#87) |
708
+ | `callback-action-for-result-aggregation` | 신규 | 1 (#129) |
709
+ | `primitive-return-without-domain-meaning` | 신규 | 2+ (#129·#36) |
710
+ | `blackjack-rule-fidelity-comparison` | 강화 | 10+ ⭐⭐⭐ |
711
+ | `ace-bonus-single-vs-multi` | 강화 | 2+ (#36·#129) |
712
+
713
+ ## 메타 어휘 (13 reviewer + MCP 핵심 가치 합류 정점 유지)
714
+
715
+ - ***KwonDae (제이든)*** — 기존 reviewer (batch 12 신규 합류) **메타 어휘 깊이 정점** (커뮤니케이션 메타 + 학생 인간적 격려 + 추상화 활용 점검 + 현실 메타포 정공).
716
+ - ***현실 메타포 = 외부 장치 X*** — KwonDae PR #129 — *"게임의 승패를 결정해주는건 외부 장치가 해주는걸까요? 실제 게임을 생각해보면, 외부 장치로 게임 승패를 결정하는게 아닌, 딜러와 참가자가 스스로 판단하게 됩니다."* — **MCP `oh-my-oop` 핵심 가치 (현실 메타포 정합)**. PR #117·#31·#21 결.
717
+ - ***추상화 활용 점검 + 학습 의도 회수*** — KwonDae PR #129 — *"지금까지 추상화를 진행한 이유에 대해 고민해보시죠!"* — *학습 의도 회수 어휘*.
718
+ - ***N 안 + 학생 선택지*** — KwonDae PR #129 — *"두가지 방법이 있을 것 같아요. (...) 어느 방법이 좋을지 고민해보시고 알려주세요!"* — **MCP `oop_propose_alternatives` 핵심 가치 합류**.
719
+ - ***커뮤니케이션 메타 (줄글 vs 핵심 내용)*** — KwonDae PR #129 — *"우테코 미션을 진행하는 것을 넘어 이후 현업에서도 커뮤니케이션 비용 줄이기에 대해 많은 사람들이 고민을 하는데요."* — *코드 외 학습 영역 + 학생 미래 커리어 의식*. **MCP `oh-my-oop` 핵심 가치 합류**.
720
+ - ***학생 인간적 격려*** — KwonDae PR #129 — *"아니요 절대 죄송하지 않으셔야 합니다 ㅎㅎ"* — *reviewer 의 인간적 학생 격려* 어휘.
721
+ - ***reviewer 의도 명시 + 학생 자가 학습 권유*** — KwonDae PR #129 — *"`deck.pop` 로직을 수정하라는게 아닌, 이 함수를 호출할 때 어떤점을 고려해야 하는지에 대해 고민해보셨으면 합니다 :)"*.
722
+ - ***학생 자가 한계 인정 (시간 압박)*** — rosemin928 PR #129 — *"시간에 쫓겨 작업하느라 미처 확인하지 못한 부분이었던 것 같아요…"* — *학습 적극성*.
723
+ - ***모든 22 스레드 학생 자가 답변 + 커밋 SHA + 자가 후속 의문 5+ 회*** — rosemin928 PR #129 — *학생 자가 학습 가시화 정점* (PR #117 결).
724
+ - ***2025 코호트 스타일 (셀프 체크리스트 + 집중 리뷰 영역 자가 명시)*** — *체계화된 PR 본문 + 학생 자가 한계 명시*. PR #117·#129 합류 = 2025 코호트 *2 PR 표본*.
725
+
726
+ → **13 reviewer + MCP `oh-my-oop` 핵심 가치 어휘 합류 정점 유지**. **2025 코호트 (모바일 안드로이드 7기) 신규 패턴**: 셀프 체크리스트 PR 본문 + 모든 스레드 commit SHA + 학생 자가 한계 인정.