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,819 @@
1
+ # PR #117 — [블랙잭 1단계] 제이 미션
2
+
3
+ - **Reviewee:** [@parkjiminnnn](https://github.com/parkjiminnnn)
4
+ - **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/117
5
+ - **단계:** 1단계
6
+ - **리뷰어:** [@woowahan-dino](https://github.com/woowahan-dino) (디노) — **신규 reviewer — 13번째**
7
+ - **라인 코멘트:** 25 스레드 — *현실 메타포 정합 (카드뭉치에서 카드 꺼내 플레이어 받는다) + 함수 vs 필드 vs computed property (`get()=`) 학생 자가 의문 + Ace 합산 수학적 풀이 + 외부글 (수학 공식) + Kotlin `by` delegation + Iterable 구현 + 함수형 프로그래밍 학습 미션 어휘 + 테스트 하드코드 검증 + `isHit` → `canHit` 이름 vs 의미 + ViewMapper 분리 + drawCount 2역할 분리 + 자식 한정 `protected`*
8
+ - **신규 reviewee** (2025년 코호트 — 3번째 코호트 합류 — 2023, 2024, 2025).
9
+
10
+ ## 잘한 점 (설계 관점)
11
+
12
+ ### 1. PR 본문 자가 의문 + 셀프 체크리스트 + 집중 리뷰 영역 명시
13
+
14
+ PR 본문 구조:
15
+ - **셀프 체크리스트 7항목** (정상 동작 / 테스트 / 피드백 반영 / 코딩 스타일 / 린트 / 프로그래밍 요구사항 / README).
16
+ - **집중 리뷰 영역 명시** *"객체의 역할에 맞게 잘 분리했는지 봐주세요!"* + *"변수명이나 함수명이 적절한가요?"*.
17
+ - **코드 리뷰 커뮤니케이션 자가 의문** — `Get 함수 vs val 필드` 학생 자가 의문 (디노 답변 → Thread 5·14·18 등 multi-thread 후속 토론).
18
+
19
+ → **체계화된 PR 본문 모범 (2025 코호트 신규 스타일)** — *셀프 체크리스트 = CI 자가 점검 + 학생 자가 의문 명시*. PR #14·#106·#80·#82·#107·#46·#91·#11·#13·#18·#73 의 *자가 의문 PR 본문* 패턴 강화.
20
+
21
+ 학생 자가 의문 인용:
22
+
23
+ > *"아래 코드의 Get 함수들을 필드로 선언하는게 나을지 함수로 선언하는게 더 나을지 궁금해요 디노! 저는 함수로 하는게 맞는 것 같아용..*
24
+ > ```kotlin
25
+ > fun getInitialCards(): Cards { ... }
26
+ > fun getCardsCount() = allCards.size
27
+ > ```"
28
+
29
+ reviewer 후속 (Thread 3·5·14·18):
30
+
31
+ - *property val vs computed property 양가성*.
32
+ - *`val cardScore: Int = cardRank.score` (즉시 초기화) vs `get() = cardRank.score` (매 호출 계산) 트레이드오프*.
33
+
34
+ → **MCP 룰 `property-val-vs-computed-property` 후보** — *Kotlin val 즉시 초기화 vs get() 매 호출 트레이드오프*.
35
+
36
+ ### 2. `data class Card(private val cardRank, private val shape)` + 3 속성 — value object
37
+
38
+ ```kotlin
39
+ data class Card(private val cardRank: CardRank, private val shape: Shape) {
40
+ val cardScore: Int = cardRank.score
41
+ val cardName: Pair<String, String> = cardRank.name to shape.name
42
+ val isAceCard: Boolean = cardRank == CardRank.ACE
43
+ }
44
+ ```
45
+
46
+ → **`isAceCard: Boolean = cardRank == CardRank.ACE`** = reviewer 권유 (Thread 2) *자가 적용 완료*.
47
+
48
+ 다만 **`cardName: Pair<String, String>` 누수** = *Pair 튜플 = 도메인 어휘 누수* (PR #36 (boogi-woogi *`List<Pair<String, Int>>` 뷰가 도메인을 너무 잘 알고 있다*) 결).
49
+
50
+ ### 3. `enum class CardRank(val score: Int)` + Ace 11 기본
51
+
52
+ ```kotlin
53
+ enum class CardRank(val score: Int) {
54
+ ACE(11),
55
+ KING(10), QUEEN(10), JACK(10),
56
+ TWO(2), THREE(3), ..., TEN(10),
57
+ }
58
+ ```
59
+
60
+ → **Ace 11 기본 + while 차감 보정** (`ScoreCalculator.calculateTotalCardScore`) — PR #20·#64·#110·#28·#125·#147·#82 의 *Ace 11 기본 + while 차감 안티패턴* 결.
61
+
62
+ 다만 *수학적 풀이 (reviewer Thread 23 후속 권유)* 로 *while 제거 완료* — `totalCardScore - ACE_MINUS_VALUE * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / ACE_MINUS_VALUE + 1)`. **MCP 룰 `ace-bonus-mathematical-vs-iterative` 후보**.
63
+
64
+ ### 4. `Players` Kotlin `by` delegation 자가 적용
65
+
66
+ ```kotlin
67
+ class Players(private val players: List<Player>) : List<Player> by players {
68
+ val names: List<String> = players.map { player -> player.name }
69
+ val cardNames: List<List<Pair<String, String>>>
70
+ get() = players.map { player -> player.cardNames }
71
+ ...
72
+ }
73
+ ```
74
+
75
+ → **Kotlin `by` delegation 활용** — reviewer (Thread 8) *Kotlin delegation 권유 외부글* (kotlinlang.org/docs/delegation.html) → 학생 자가 적용.
76
+
77
+ 다만 **delegation = §PR #21 의 *일급 컬렉션 위임 = 나쁜 습관* 반대 시점**:
78
+
79
+ PR #21 (galcyurio) 의 *위임 = 컬렉션처럼 쓰는 나쁜 습관* vs PR #117 (woowahan-dino) 의 *delegation 어휘 권유*. **2 reviewer 의 *반대 시점***.
80
+
81
+ #### 4.1. *2 가지 트레이드오프*
82
+
83
+ | 안 | 장점 | 단점 |
84
+ |---|---|---|
85
+ | `by` delegation (현재) | *Kotlin 어휘 + List 메서드 자동 제공 (forEach/map/filter)* | *Tell-Don't-Ask 위반 위험 (List 처럼 사용) + 도메인 메시지 가시성 ↓* |
86
+ | 일급 컬렉션 + 도메인 메시지만 | *Tell-Don't-Ask 정공 + 도메인 의도 명확* | *List 메서드 X (외부 호출 시 불편)* |
87
+
88
+ → **2 reviewer 메타 어휘 = MCP `oop_propose_alternatives` 핵심 가치 합류 (개인 의견 분리)**.
89
+
90
+ PR #21 (galcyurio) + PR #117 (woowahan-dino) — *delegation 정공 토론*.
91
+
92
+ ### 5. `protected fun addCard(card: Card)` 자식 한정 가시성 자가 적용
93
+
94
+ ```kotlin
95
+ abstract class Participant(private val cards: Cards) {
96
+ ...
97
+ protected fun addCard(card: Card) {
98
+ handCards.add(card)
99
+ }
100
+ }
101
+ ```
102
+
103
+ → reviewer (Thread 16) *"지금은 addCard() 함수가 자식 클래스에서만 사용하도록 되어있는데 자식 클래스에서만 접근가능하도록 접근제어자를 추가해보면 어떨까요?"* → 학생 자가 적용. **`protected` 가시성 = 자식 한정 + 외부 호출 차단**. PR #87 결.
104
+
105
+ ### 6. `ScoreCalculator.adjustAceScore` 수학적 풀이 — while 제거
106
+
107
+ ```kotlin
108
+ private fun adjustAceScore(totalCardScore: Int, aceCount: Int) =
109
+ totalCardScore - ACE_MINUS_VALUE * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / ACE_MINUS_VALUE + 1)
110
+ ```
111
+
112
+ → **`while` 반복 → 수학적 단일 식 변환** (reviewer Thread 23 권유 → 학생 자가 적용).
113
+
114
+ #### 6.1. *수학 공식 도출*
115
+
116
+ - Ace 11→1 = -10 점.
117
+ - 초과 점수 = `totalCardScore - BLACKJACK_SCORE` (양수).
118
+ - 필요한 -10 회수 = `초과 / 10 + 1` (1 부터 시작 = +1).
119
+ - 다만 최대 -10 회수 = `aceCount` (Ace 개수 한정) → `coerceAtMost(aceCount)`.
120
+
121
+ → **MCP 룰 `iterative-loop-vs-math-formula` 강화** — *반복문 의존 vs 수학적 단일 식*. 외부글 동반.
122
+
123
+ PR #87 (mutableMap → fold) 결의 *명령형 vs 함수형/수학적* 어휘 합류.
124
+
125
+ ### 7. 모든 25 스레드 학생 자가 답변 + 커밋 SHA 첨부
126
+
127
+ 25 스레드 전부 학생이 *반영 커밋 링크 (`https://github.com/woowacourse/kotlin-blackjack/pull/117/commits/<sha>`)* 첨부.
128
+
129
+ → **학생 자가 학습 가시화 모범 = 학습 가시화 정점**. PR #124·#128·#135·#108·#133·#136·#137·#148·#151·#146·#147·#88·#36·#87 결.
130
+
131
+ ### 추가 칭찬
132
+
133
+ - *Thread 5*: *"너무 좋습니다 👍 저는 여기서 get함수보다 val로 선언해서 가져와도 좋다고 봐요"* — *학생 자가 의문 + reviewer confederate*.
134
+
135
+ ## 못한 점 (설계 관점)
136
+
137
+ ### 1. `createCardRank` 함수명 vs 실제 반환 — 이름·반환 불일치
138
+
139
+ reviewer (Thread 1):
140
+
141
+ > *"createCardRank 라는 함수명을 봤을 때는 CardRank를 만들어서 반환하는 느낌인데 함수 구현부는 그렇지 않네요. 적절한 함수명으로 변경하거나, cards를 전달하지 않고 `List<Card>`를 반환하는 형태로 변경해보면 어떨까요?"*
142
+
143
+ 학생: *"함수명을 변경했습니당 🫠"*
144
+
145
+ → **함수 이름·반환 의미 불일치** — PR #36 (boogi-woogi `decideAceValue` 1 or 11 예상 vs 실제 추가 점수) 결 강화.
146
+
147
+ **MCP 룰 `function-name-vs-return-semantic-mismatch` 강화** 누적 3+ PR (#36·#117·#21).
148
+
149
+ ### 2. `cardName.contains("A")` vs `cardRank == CardRank.ACE` — Stringly-typed 회피
150
+
151
+ reviewer (Thread 2):
152
+
153
+ > *"cardName에 'A'가 포함되어 있는 것 보다 cardRank가 ACE인지 확인하면 어떨까요??*
154
+ > ```
155
+ > fun isAceCard(): Boolean = cardRank == CardRank.ACE
156
+ > ```"
157
+
158
+ 학생: *"굳이 문자열 값을 비교하지 않고 cardRank에 담겨 있는 값을 통해 비교하는게 더 좋을 것 같네용"*
159
+
160
+ → **Stringly-typed vs enum 비교** — *문자열 검색 = 오타 위험 + 의미 누수* vs *enum 비교 = 컴파일러 강제*.
161
+
162
+ **MCP 룰 `stringly-typed-vs-enum-comparison` 후보** — *문자열 contains vs enum equality*.
163
+
164
+ PR #20·#28·#125·#147·#65·#92 결의 *enum의 UI value* 안티패턴 변형 (UI 값 검색).
165
+
166
+ ### 3. `val cardScore: Int = cardRank.score` vs `get() = cardRank.score` — property val vs computed property
167
+
168
+ reviewer (Thread 3):
169
+
170
+ > *"`val cardScore: Int = cardRank.score`*
171
+ > *로 하는 것과*
172
+ > *`val cardScore: Int`*
173
+ > *` get() = cardRank.score`*
174
+ > *로 하는 것은 어떤차이가 있을까요?*
175
+ >
176
+ > *이 코드에서는 어떤게 더 적합할지 한번 고민해보면 좋을 것 같아요"*
177
+
178
+ 학생: *"score값을 매번 초기화해줄 필요없이 한번만 해도 된다고 생각하기 때문에 이렇게 하는게 맞는 것 같아요!"*
179
+
180
+ reviewer 후속 (Thread 14): *"함수보다 field로 사용하면 더 좋을 것 같네요"*
181
+ reviewer 후속 (Thread 18): *"카드를 추가할 때 마다 새로운 값을 가져와야 한다면 `get() =` 을 사용하면 됩니다."*
182
+
183
+ → **Kotlin property 3 가지 형태**:
184
+
185
+ | 안 | 의미 | 적합 시점 |
186
+ |---|---|---|
187
+ | `val cardScore: Int = cardRank.score` | *인스턴스 생성 시 한 번 초기화 + 불변* | *값이 인스턴스 생애 동안 변하지 않을 때* (현재 Card 의 cardScore) |
188
+ | `val cardScore: Int get() = cardRank.score` | *매 호출 시 계산 + 항상 최신* | *값이 변할 수 있을 때 / 의존성이 mutable* |
189
+ | `fun getCardScore(): Int = cardRank.score` | *매 호출 시 계산 + 함수 의도 명시* | *부작용 가능 / 인자 필요 / 명령형 동작* |
190
+
191
+ #### 3.1. *Kotlin 어휘 정공*
192
+
193
+ PR 본문 자가 의문 (Get 함수 vs val) → reviewer 다회 답변 (Thread 3·5·14·18) → 학생 multi-step 자가 학습.
194
+
195
+ **MCP 룰 `property-val-vs-computed-property` 후보** — *Kotlin property 3 형태 트레이드오프*.
196
+
197
+ ### 4. `distinct()` vs `toSet()` — 함수 의도 양가
198
+
199
+ reviewer (Thread 4):
200
+
201
+ > *"distinct() 함수가 어떻게 구현되어 있는지 한번 보시고 distinct()대신 다른 함수를 쓰도록 변경해보면 좋을 것 같습니다. 아니면 제이는 여기서 distinct()를 사용하신 이유가 중복제거 외에 다른 의미도 있었을까요?"*
202
+
203
+ 학생: *"중복제거 말고는 다른 의미는 없었어요..😅"*
204
+
205
+ → **`distinct()` vs `toSet()` 의미 비교**:
206
+
207
+ | 함수 | 의도 | 비용 |
208
+ |---|---|---|
209
+ | `distinct()` | *순서 보존 + 중복 제거 (List 유지)* | *O(n) + HashSet 보조 자료구조 내부* |
210
+ | `toSet()` | *순서 X + 중복 자가 X* | *O(n) + HashSet* |
211
+
212
+ 학생의 *카드 중복 invariant 검증* 용도 = *순서 보존 불필요* → `toSet()` 적합.
213
+
214
+ ```kotlin
215
+ // AS-IS
216
+ require(allCards.distinct().size == getCardsCount())
217
+ // TO-BE
218
+ require(allCards.toSet().size == totalCount)
219
+ ```
220
+
221
+ **MCP 룰 `distinct-vs-toSet-intent` 후보** — *함수 의도 = 순서 보존 여부*.
222
+
223
+ ### 5. `getCardsCount` → `cardsCount` — Cards 클래스 내 *count* 어휘
224
+
225
+ reviewer (Thread 5):
226
+
227
+ > *"저는 여기서 get함수보다 val로 선언해서 가져와도 좋다고 봐요. getCardsCount보다 cardsCount가 더 좋아보이고 이미 class 이름이 Cards니까 count만 해도 되지 않을까 싶습니다. 제이가 제 피드백이 괜찮다고 생각하시면 다른 것들도 같이 반영해봐도 좋을 것 같습니다~"*
228
+
229
+ 학생: *"카드를 추가할 때마다 초기화 해줘야 해서 val로 선언하면 안될 것 같네용..🥲 함수명만 수정하겠습니당"*
230
+
231
+ reviewer 후속 (Thread 18): *"카드를 추가할 때 마다 새로운 값을 가져와야 한다면 `get() =` 을 사용하면 됩니다."*
232
+
233
+ → **클래스 명 = 의도 일부 → 멤버 명 중복 회피** (`Cards.cardsCount` vs `Cards.count` vs `Cards.totalCount`). 학생 최종 `totalCount` 자가 적용.
234
+
235
+ **MCP 룰 `member-name-includes-class-name` 후보** — *Cards.cardsCount = 클래스 이름 중복*.
236
+
237
+ ### 6. `isHit` → `canHit` — 이름 의미 정확성
238
+
239
+ reviewer (Thread 6):
240
+
241
+ > *"함수를 사용하는 곳을 보니 **hit이 가능할 때 카드를 받는다** 인 것 같아요. isHit이라는 것 Hit이냐? 라는 의미라 적절한 이름은 아니라고 생각합니다. Hit이 가능한지? 라는 의미로 canHit 정도로 하면 어떨까요?"*
242
+
243
+ 학생: *"좋은데요? 가시죠!!"*
244
+
245
+ → **이름 의미 정확성** — *isHit (지금 Hit이다) vs canHit (Hit 가능하다)* 의 도메인 의미 차이.
246
+
247
+ **MCP 룰 `is-vs-can-prefix-semantics` 후보** — *is-prefix (현재 상태) vs can-prefix (가능 여부) 의미 구분*. PR #21 (Player.isHit() = !isBust()) 결의 *Hit 자동 시점 vs 사용자 선택* 변형.
248
+
249
+ ### 7. `16` 매직 넘버 → 상수
250
+
251
+ reviewer (Thread 7):
252
+
253
+ > *"여기서 16이 어떤 의미인지 상수로 빼서 관리하면 어떨까요??"*
254
+
255
+ 학생 자가 적용: `private const val DEALER_HIT_LIMIT = 16`.
256
+
257
+ → **매직 넘버 회피 + 도메인 의미 어휘** (Dealer hit 한계 = 16). PR #20·#28·#125·#125·#147·#65·#92·#36 결.
258
+
259
+ ### 8. `score = calculateCardScore() - cards.aceCount() + cards.aceCount()` inline 정리 — 동치 표현 회피
260
+
261
+ reviewer (Thread 10):
262
+
263
+ > *"score를 만들기 위해 호출하는 함수들을 전부 inline처리하면 이렇게 되네요*
264
+ > *`var score = calculateCardScore() - cards.aceCount() + cards.aceCount()`*
265
+ > *cards.aceCount를 빼고 더해서 사실상 calculateCardScore()만 해도 되겠네요"*
266
+
267
+ → **함수 합성 후 동치 식 = 추상화 의도 누수** — *Score = score - aceCount + aceCount = score*. **추상화가 동작 의도를 가리는 안티패턴**.
268
+
269
+ #### 8.1. *함수 합성 시 동치 검증*
270
+
271
+ 학생 초기 코드:
272
+ ```kotlin
273
+ fun calculate(cards: Cards): Int {
274
+ var score = calculateCardScore(cards)
275
+ score = subtractAceCount(score, cards)
276
+ score = addAceCount(score, cards)
277
+ return score
278
+ }
279
+ ```
280
+
281
+ → *함수 3 단계 분리 → inline 시 `score - aceCount + aceCount = score` 자명*. **함수 분리가 *추상화 의도 X*** = *함수 분리 비용만 발생*.
282
+
283
+ **MCP 룰 `function-decomposition-creates-identity` 후보** — *함수 분리가 inline 후 동치 = 추상화 의도 X*. PR #36·#46·#39 (function-decomposition-excess) 결 강화.
284
+
285
+ ### 9. 반복문 의존 vs 수학적 풀이 — Ace 합산 + 외부글
286
+
287
+ reviewer (Thread 11):
288
+
289
+ > *"개발을 하다보면 가끔 반복문에 너무 의존하게 될 때가 있습니다. 우리가 만약에 1부터 10까지 합을 구한다고 하면 1부터 10까지 반복문을 돌리는 것을 먼저 떠올리게 됩니다. 하지만 그것보다 더 좋은 수학적인 방법이 존재합니다. 이 로직도 꼭 반복문을 돌려야하는지? 수학적으로 풀 수 없는지? 를 생각해보면 좋을 것 같습니다.*
290
+ > *https://leebaro.tistory.com/entry/1%EB%B6%80%ED%84%B0-10%EA%B9%8C%EC%A7%80-%EC%88%AB%EC%9E%90%EB%A5%BC-%ED%95%A9%ED%95%98%EB%8A%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98"*
291
+
292
+ 학생 자가 한계 인정:
293
+
294
+ > *"가지고 있는 ace카드의 개수만큼 반복문으로 카드를 힛하는 턴마다의 카드의 총합을 계산해서 ace카드의 점수를 유동적으로 바꿀 수 있다고 생각을 합니다.. 근데 반복문을 사용하지 않고 수학적인 방법으로만 턴마다 카드 점수의 총합을 유동적으로 계산하는건 어떻게 해야 할지 도저히 감이 안 잡히는데 힌트를 조금만 더 주실 수 있을까요?🥺"*
295
+
296
+ reviewer 후속 (Thread 23 — 힌트):
297
+
298
+ > *"이렇게 하면 while 없이 계산해서 넣을 수 있겠네요*
299
+ > ```kotlin
300
+ > val totalCardScore = cards.scores().sum()
301
+ > val aceCount = cards.aceCount()
302
+ > return if (totalCardScore > BLACKJACK_SCORE && aceCount > 0) {
303
+ > totalCardScore - 10 * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / 10 + 1)
304
+ > } else {
305
+ > totalCardScore
306
+ > }
307
+ > ```"
308
+
309
+ 학생: *"감사합니당. if문으로 조건을 나눌 생각을 못했네요😅"*
310
+
311
+ → **반복문 의존 vs 수학적 풀이 + 외부글 + 학생 자가 힌트 요청 + reviewer 후속 답변**:
312
+
313
+ #### 9.1. *3 가지 학습 시점*
314
+
315
+ 1. **반복문 의존 안티패턴 인식** — *Ace = 1↔11 분기 = while 도는 반사적 반응*.
316
+ 2. **수학적 풀이 = `초과 / 10 + 1` (단일 식)** — `coerceAtMost(aceCount)` 활용.
317
+ 3. **외부글 + 학생 자가 힌트 요청 = 학생 학습 적극성** — *reviewer 답변 제공*.
318
+
319
+ **MCP 룰 `iterative-loop-vs-math-formula` 강화** ⭐⭐. PR #87 (mutableMap → fold) 결과 같은 *명령형 vs 함수형/수학적* 어휘 합류.
320
+
321
+ ### 10. `model = domain vs view` — ViewMapper 분리 + Cards.isDisplayName 확장함수
322
+
323
+ reviewer (Thread 12):
324
+
325
+ > *"미션을 하고 있는 프로젝트에서 model이라는게 domain관점인지 view관점인지가 중요할 것 같아요. domain 관점에서는 title이라는 view 관점의 값들이 들어있는게 맞을까? 라는 의문을 가져보면 어떨까요?*
326
+ >
327
+ > ***ViewMapper나 Cards.isDisplayName()과 같은 확장함수를 사용하는 방식*** *도 괜찮은 방법 입니다."*
328
+
329
+ 학생 자가 적용 (4 commit):
330
+ - *ViewMapper 클래스 생성*.
331
+ - *카드이름의 출력방식 변경 함수 생성*.
332
+ - *title 프로퍼티 제거*.
333
+ - *반환 타입 변경*.
334
+
335
+ → **Model → View 의존성 분리 = MVC 절대 원칙** + **ViewMapper / 확장함수 2 가지 안**:
336
+
337
+ #### 10.1. *3 가지 대안*
338
+
339
+ | 안 | 장점 | 단점 |
340
+ |---|---|---|
341
+ | Model 안 UI 메서드 (학생 초안 *title* 프로퍼티) | *카드 자가 표현 보유 + 호출 간결* | *Model → View 결합 + MVC 위반* |
342
+ | `ViewMapper` 별도 클래스 (학생 자가 적용) | *변환 책임 명확 + Model 순수* | *클래스 ↑ + 매핑 보일러플레이트* |
343
+ | `Cards.isDisplayName()` 확장함수 (reviewer 권유) | *Kotlin 어휘 + Model 순수 + 호출 간결* | *확장함수 검색성 ↓ + import 누수* |
344
+
345
+ **MCP 룰 `view-mapper-vs-extension-function` 후보** — *Model→View 분리 방법 트레이드오프*. PR #21·#87·#88·#80·#76 결 강화.
346
+
347
+ ### 11. 현실 메타포 정합 — *카드뭉치에서 카드 꺼내 플레이어 받는다*
348
+
349
+ reviewer (Thread 13):
350
+
351
+ > *"이 동작에 대해서 생각해볼 필요가 있을 것 같아요. 현실에서는 카드뭉치에서 카드 한장을 꺼내서 플레이어가 받는다 라는 동작인데 이 코드를 보면 플레이어가 카드뭉치를 받고 거기서 카드를 받는 동작으로 보여요. 이 부분을 개선해보면 어떨까요?"*
352
+
353
+ 학생 자가 적용: *"뽑은 카드를 받는 기능으로 변경"*.
354
+
355
+ → **현실 메타포 정합 = 책임 분배 단계의 핵심**:
356
+
357
+ #### 11.1. *3 가지 책임 분배 안*
358
+
359
+ | 안 | 메타포 | 책임 |
360
+ |---|---|---|
361
+ | `player.receiveCards(deck)` (학생 초안) | *플레이어가 카드덱을 받음 → 거기서 카드 받음* | *플레이어 ↔ 카드덱 양방향 + 메타포 X* |
362
+ | `deck.dealTo(player)` | *카드덱이 분배자 = 플레이어에게 카드 줌* | *카드덱이 분배 책임 (카지노 메타포)* |
363
+ | `player.receive(drawnCard: Card)` (학생 자가 적용) | *플레이어가 *이미 뽑힌 카드 1장* 받음* | *현실 정공 (딜러가 뽑아서 줌)* |
364
+
365
+ → **현실 메타포 = 객체 책임 분배 핵심 어휘** = **MCP `oh-my-oop` 핵심 가치**. PR #31 (no1msh *발급기 그 자체에게는 돈이 필요하지 않다*) 결 + PR #21 (CardPicker = 가상 객체) 결.
366
+
367
+ **MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ — *현실에서 누가 이 일을 하는가*. 누적 8+ PR.
368
+
369
+ ### 12. MutableList 회피 — 함수형 프로그래밍 학습 미션 어휘
370
+
371
+ reviewer (Thread 15):
372
+
373
+ > *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까 MutableList를 만들지 않고 기존에 있는 List나 Array를 사용해서 만들어 보도록 해볼까요? Iterable 확장함수로 여러 함수들이 제공되고 있으니 적절한 함수들을 찾아서 변경해보면 좋을 것 같아요. addCardsByRank()함수도 제거할 수 있을 것 같습니다."*
374
+
375
+ → **함수형 프로그래밍 학습 미션 어휘 = 의도 명시**:
376
+
377
+ #### 12.1. *학습 의도 = 미션의 본질*
378
+
379
+ reviewer 가 *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까"* 명시 = *학습 목표 의식*. **학생 자가 학습 가시화 어휘**. PR #91·#107·#147·#22·#73·#76·#80·#82·#11·#13 결.
380
+
381
+ #### 12.2. *Iterable 확장함수 (flatMap, map, fold) 권유*
382
+
383
+ 학생 초안:
384
+ ```kotlin
385
+ fun createCards(): MutableList<Card> {
386
+ val cards = mutableListOf<Card>()
387
+ CardRank.values().forEach { rank -> addCardsByRank(cards, rank) }
388
+ return cards
389
+ }
390
+ ```
391
+
392
+ 수정 후:
393
+ ```kotlin
394
+ fun createCards(): List<Card> =
395
+ CardRank.values().flatMap { rank -> Shape.values().map { shape -> Card(rank, shape) } }
396
+ ```
397
+
398
+ PR #21 (CardPackGenerator buildList 4 단계 중첩) 결 + PR #87 (mutableMap → fold) 결 동일 *명령형 vs 함수형* 어휘.
399
+
400
+ **MCP 룰 `mutable-list-vs-functional-pipeline` 후보** — *MutableList 회피 + Iterable 확장함수*.
401
+
402
+ ### 13. `drawCount()` 함수 = 2 역할 — count 가져옴 + 카드 뽑음
403
+
404
+ reviewer (Thread 19):
405
+
406
+ > *"drawCount라는 함수가 한가지의 역할만 하지는 않는 것 같아요.*
407
+ >
408
+ > *drawCount만 보면 카드를 뽑은 개수를 가져오는 것으로 느껴지는데 내부에서는 실제로 카드를 뽑을 수 있으면 카드를 뽑는 역할도 하고 있어요. 함수를 분리해볼 수 있지 않을까요?"*
409
+
410
+ 학생 자가 적용: *drawCount() 로직 분리*.
411
+
412
+ → **함수 단일 책임 위반 (SRP)** — *조회 (count 가져옴) + 부작용 (카드 뽑음) 양가*. **CQS (Command-Query Separation) 위반**.
413
+
414
+ #### 13.1. *2 가지 학습*
415
+
416
+ #### 13.1.1. *CQS 원칙*
417
+
418
+ *Command (부작용) vs Query (조회) 분리* = 메서드 1 = 1 역할.
419
+
420
+ 학생 코드:
421
+ ```kotlin
422
+ fun drawCount(drawnCard: Card): Int {
423
+ var drawCount = DEFAULT_DRAW_COUNT
424
+ drawCount += addDraws(drawnCard) // ← 카드 뽑음 (Command)
425
+ return drawCount // ← count 반환 (Query)
426
+ }
427
+ ```
428
+
429
+ → **Command + Query 양가**. **MCP 룰 `command-query-separation` 후보**.
430
+
431
+ #### 13.1.2. *이름 의미 누수*
432
+
433
+ `drawCount` 이름 = *Query (count 가져옴)* 시사 → *실제는 Command + Query*. PR #36 (decideAceValue 명명·반환 불일치) 결 + Thread 1 (createCardRank) 결.
434
+
435
+ ### 14. `enum` 으로 처리 가능 — GameResultDecider
436
+
437
+ reviewer (Thread 20):
438
+
439
+ > *"이것들은 enum으로 처리 할 수 있지 않을까요?"*
440
+
441
+ 학생 자가 적용: *VictoryStatus enum 생성 + mapToVictoryStatus 변환*.
442
+
443
+ → **상수/문자열 → enum 변환** — *컴파일러 강제 + 의미 명시*. PR #20·#28·#125·#147·#65·#92 결.
444
+
445
+ ### 15. 테스트 = 하드코드 검증 (CardRank/Shape 변경 안전)
446
+
447
+ reviewer (Thread 22):
448
+
449
+ > *"만약 CardRank나 Shape가 어떤 값이 빠지거나 새로운 값이 추가되면 검증하기 어려울 것 같습니다. 보통 테스트 코드에서는 이렇게 코드를 만드는 것보단 하드코드 된 것으로 검증하는게 좋습니다."*
450
+
451
+ 학생 자가 적용.
452
+
453
+ → **테스트 = 하드코드 검증 정공**:
454
+
455
+ #### 15.1. *Production 코드 의존 X*
456
+
457
+ 학생 초기 테스트:
458
+ ```kotlin
459
+ @Test fun `카드 생성 테스트`() {
460
+ val cards = CardsGenerator().createCardPack()
461
+ assertEquals(CardRank.values().size * Shape.values().size, cards.totalCount)
462
+ }
463
+ ```
464
+
465
+ → *`CardRank.values().size * Shape.values().size = 13 * 4 = 52`* — *production 코드 의존*. CardRank 추가 시 *테스트 같이 변경됨* → 회귀 감지 X.
466
+
467
+ 수정 후:
468
+ ```kotlin
469
+ @Test fun `카드 생성 테스트`() {
470
+ val cards = CardsGenerator().createCardPack()
471
+ assertEquals(52, cards.totalCount) // ← 하드코드
472
+ }
473
+ ```
474
+
475
+ → *CardRank 가 13 미만이 되면 테스트 실패 = 회귀 감지*.
476
+
477
+ **MCP 룰 `test-hardcoded-vs-production-derived` 강화** — *테스트 = 하드코드 검증 정공*. 누적 3+ PR (#99·#26·#117).
478
+
479
+ PR #87 (테스트 = 객체 설계 명세서) 결 + PR #21 (테스트 본문 = 필요한 정보) 결 + PR #26 (테스트 = 명세서) 결 합류.
480
+
481
+ ### 16. `Players.kt` `val` 자가 적용 권유 — Iterable 구현 시
482
+
483
+ reviewer (Thread 9 + 21):
484
+
485
+ > *"Players 클리스가 Iterable<Player> 이기 때문에 players를 val로 선언하지 않아도 되는 것으로 보입니다."*
486
+ > *"여기도 val로 해볼 수 있겠네요"*
487
+
488
+ → **Iterable 구현 시 backing list val 불필요** — *delegation 의 의도 명확 → 별도 list 보관 X*.
489
+
490
+ 다만 학생 최종 코드 (`class Players(private val players: List<Player>) : List<Player> by players`) = *delegation source 는 여전히 보관* → reviewer 의 권유 ≠ list 제거 = *names/cardNames/scores 같은 *Players 추가 속성*만 val 화*.
491
+
492
+ **MCP 룰 `delegation-source-val-redundancy` 후보** — *delegation source list 보관 의도 점검*.
493
+
494
+ ### 17. `showPlayerResult` 파라미터 비대칭 — playersNames 만 외부 전달
495
+
496
+ reviewer (Thread 17):
497
+
498
+ > *"updatedPlayerCardsNames, playersTotalScore 는 players에서 가져오는데 showPlayerResult로 전달되는 playersNames만 함수 외부에서 파라미터로 전달하는 이유가 있나요?"*
499
+
500
+ 학생 자가 적용: *showPlayerResult 인자 제거*.
501
+
502
+ → **함수 인자 일관성 = 객체 가져오는 자리 통일** — *3 인자 중 1 만 외부 전달 = 일관성 X*. **MCP 룰 `function-parameter-asymmetry` 후보**.
503
+
504
+ ### 18. `addDraws()` `Dealer.turn()` 의 `canHit()` 중복 호출
505
+
506
+ reviewer (Thread 25):
507
+
508
+ > *"turn()함수에서 canHit()을 호출하고 있기 때문에 addDraws()함수에 있는 while에서는 canHIt()를 호출하지 않아도 될 것 같네요"*
509
+
510
+ 학생 코드:
511
+ ```kotlin
512
+ override fun turn(drawnCard: Card): Boolean {
513
+ if (canHit()) { addCard(drawnCard); return true }
514
+ return false
515
+ }
516
+
517
+ private fun addDraws(drawnCard: Card): Int {
518
+ var count = DEFAULT_DRAW_COUNT
519
+ while (canHit() && turn(drawnCard)) count++ // ← canHit 중복 호출
520
+ return count
521
+ }
522
+ ```
523
+
524
+ → **canHit 중복 호출** — *while 조건과 turn 내부 모두 canHit 호출* = *2 회 평가*. **MCP 룰 `redundant-guard-condition` 후보**.
525
+
526
+ ### 19. `Players` Cards 와 함수 내부 처리 — Controller god-object 예방
527
+
528
+ reviewer (Thread 24):
529
+
530
+ > *"여기도 Players와 Cards를 넘겨서 함수 내부에서 처리 해볼 수 있겠네요"*
531
+
532
+ → **Controller 가 Players/Cards 외부에서 처리 → Tell-Don't-Ask 위반**. *Players/Cards 가 자가 처리 + 결과만 반환*. PR #87·#36·#28·#92·#48 결.
533
+
534
+ ### 20. `Players.toList()` (학생 자가 적용한 일급 컬렉션) — delegation 합류 vs Tell-Don't-Ask
535
+
536
+ §4 참조. PR #21 (galcyurio *delegation = 컬렉션처럼 쓰는 나쁜 습관*) 와 PR #117 (woowahan-dino *delegation 정공*) 의 *반대 시점*.
537
+
538
+ → **MCP `oop_propose_alternatives` 핵심 가치 합류 정점** — *reviewer 별 의견 차이 인정*.
539
+
540
+ ### 21. `Cards.kt` `allCards.toMutableList()` + `allCards.removeAll()` — mutable 누수
541
+
542
+ ```kotlin
543
+ class Cards(allCards: List<Card>) {
544
+ val allCards: MutableList<Card> = allCards.toMutableList()
545
+ ...
546
+ fun initialCards(): Cards {
547
+ val initialCards = allCards.take(INITIAL_CARD_COUNT)
548
+ allCards.removeAll(initialCards)
549
+ return Cards(initialCards)
550
+ }
551
+ }
552
+ ```
553
+
554
+ → **`val allCards: MutableList<Card>` public 노출** = *외부에서 변경 가능* + *`removeAll` 자가 변경*. **canonical mutable leak**.
555
+
556
+ 대안: `private val _cards: MutableList<Card>` + `val cards: List<Card> get() = _cards.toList()` (backing property). PR #18·#36·#21 결.
557
+
558
+ **MCP 룰 `mutable-list-public-exposure` 강화** — 누적 5+ PR.
559
+
560
+ ### 22. `GameResultDecider` Tell-Don't-Ask — Dealer/Player score 직접 비교
561
+
562
+ ```kotlin
563
+ class GameResultDecider(private val dealer: Dealer, private val players: Players) {
564
+ fun compareWinOrLose(): GameOutput {
565
+ ...
566
+ }
567
+
568
+ private fun comparePlayerResult(playerScore: Int): VictoryStatus =
569
+ when {
570
+ dealer.currentScore > BLACKJACK_SCORE -> VictoryStatus.WIN
571
+ playerScore > BLACKJACK_SCORE -> VictoryStatus.LOSE
572
+ else -> compareScores(playerScore)
573
+ }
574
+ }
575
+ ```
576
+
577
+ → **Decider 객체 + Dealer/Player score 외부 꺼내서 비교** = *Tell-Don't-Ask 위반*. PR #87·#36·#28·#92·#48 결.
578
+
579
+ 대안: **`Player.compareWith(dealer): VictoryStatus`** 또는 **State 다형성** (PR #93·#136·#152·#98·#87 결).
580
+
581
+ 다만 학생의 *GameResultDecider 분리* = *비교 책임 단일 위치* (vs Player.compareWith 가 *Player ↔ Dealer 양방향 결합*).
582
+
583
+ **MCP 룰 `decider-vs-tell-dont-ask` 후보**.
584
+
585
+ ### 23. `currentScore` 매 호출 시 `ScoreCalculator(cards).calculateTotalCardScore()` 신규 인스턴스
586
+
587
+ ```kotlin
588
+ abstract class Participant(private val cards: Cards) {
589
+ ...
590
+ val currentScore: Int
591
+ get() = ScoreCalculator(cards).calculateTotalCardScore()
592
+ }
593
+ ```
594
+
595
+ → **매 호출 시 `ScoreCalculator` 신규 인스턴스 + 계산** = *비용 ↑*. *ScoreCalculator 가 stateless (cards 만 멤버)* → *companion object 정적 메서드* 대안.
596
+
597
+ 대안:
598
+ ```kotlin
599
+ object ScoreCalculator {
600
+ fun calculateTotalCardScore(cards: Cards): Int = ...
601
+ }
602
+
603
+ // 호출
604
+ val currentScore: Int get() = ScoreCalculator.calculateTotalCardScore(cards)
605
+ ```
606
+
607
+ **MCP 룰 `stateless-class-vs-companion-object` 후보** — *stateless 클래스 인스턴스화 vs companion object 정적*. PR #20·#28·#125 결.
608
+
609
+ ### 24. `Dealer.turn` 반환 boolean 의미 + `Player.turn` 반환 boolean 의미 — 역방향
610
+
611
+ ```kotlin
612
+ // Dealer
613
+ override fun turn(drawnCard: Card): Boolean {
614
+ if (canHit()) { addCard(drawnCard); return true }
615
+ return false
616
+ }
617
+
618
+ // Player
619
+ override fun turn(drawnCard: Card): Boolean {
620
+ if (canHit()) { addCard(drawnCard); return false } // ← Dealer 와 반대
621
+ return true
622
+ }
623
+ ```
624
+
625
+ → **`turn()` 반환 의미 Dealer/Player 역방향** — *Dealer.turn = true (hit 함) / Player.turn = false (hit 함)*.
626
+
627
+ 도메인 의미:
628
+ - Dealer: *turn() = true → 계속 hit (16 이하 동안)*.
629
+ - Player: *turn() = true → 종료 (carry, hit 안 함)*.
630
+
631
+ → **이름·의미 양가** → 사용자 (Controller) 가 *Dealer.turn 인지 Player.turn 인지에 따라 분기 의미 반대*.
632
+
633
+ **MCP 룰 `method-return-semantic-asymmetry-between-subclasses` 후보** — *부모 추상 메서드 반환 의미 자식 별 역방향*.
634
+
635
+ ### 25. `Card.cardName: Pair<String, String>` — Tuple 누수
636
+
637
+ ```kotlin
638
+ val cardName: Pair<String, String> = cardRank.name to shape.name
639
+ ```
640
+
641
+ → **Tuple `Pair<String, String>` 도메인 어휘 누수** — *(rank, shape) 짝 = 도메인 객체로 표현 권유*. PR #36 (boogi-woogi *`List<Pair<String, Int>>` 뷰가 도메인을 너무 잘 알고 있다*) 결.
642
+
643
+ 대안:
644
+ - `data class CardName(val rank: String, val shape: String)`.
645
+ - `fun displayName(): String` (UI 변환 책임 명확).
646
+ - View 가 `Card` 받아서 *card.cardRank.name + card.shape.name* 자가 처리.
647
+
648
+ reviewer 명시 X — 다만 *Thread 12 (Model = domain vs view)* 와 결합.
649
+
650
+ **MCP 룰 `tuple-leak-vs-domain-dto` 강화** — 누적 3+ PR (#36·#87·#117).
651
+
652
+ ## 리뷰어 의견 요지
653
+
654
+ - **현실 메타포 정합** — *카드뭉치에서 카드 꺼내 플레이어 받는다* (Thread 13). *책임 분배 메타포 핵심*.
655
+ - **이름·의미 정확성** — *createCardRank* (CardRank 반환 X), *isHit* → *canHit*, *drawCount* 2 역할.
656
+ - **property val vs computed property** — *학생 자가 의문 + reviewer 다회 답변 (Thread 3·5·14·18)*.
657
+ - **Kotlin delegation 권유** — *외부글 (kotlinlang.org) 동반*. PR #21 (galcyurio *위임 = 나쁜 습관*) 와 **반대 시점**.
658
+ - **함수형 프로그래밍 학습 미션 어휘** — *MutableList 회피 + Iterable 확장함수*. *학습 의도 의식*.
659
+ - **반복문 의존 vs 수학적 풀이** — *외부글 (leebaro 1부터 10까지 합) + 학생 자가 힌트 요청 + reviewer 후속 답변*.
660
+ - **Stringly-typed → enum 비교** — *cardName.contains("A") → cardRank == ACE*.
661
+ - **함수 합성 동치 = 추상화 의도 X** — *score - aceCount + aceCount = score*.
662
+ - **테스트 = 하드코드 검증** — *production 코드 의존 X = 회귀 감지*.
663
+ - **함수 인자 일관성** — *playersNames 만 외부 전달 = 비대칭*.
664
+ - **canHit 중복 호출** — *while 조건과 turn 내부 모두 호출*.
665
+ - **`protected` 자식 한정 가시성** — *addCard 외부 호출 차단*.
666
+ - **Model = domain vs view 의문 + ViewMapper / 확장함수 2 안** — *MVC 절대 원칙*.
667
+ - **enum 변환 권유** — *상수/문자열 → 컴파일러 강제*.
668
+ - **distinct() vs toSet() 의도** — *순서 보존 여부*.
669
+ - **클래스 이름과 멤버 이름 중복** — *Cards.cardsCount → Cards.count*.
670
+ - **수정 후 칭찬** — *반영 후 commit 링크 첨부 모범*.
671
+
672
+ ## 대표 인용
673
+
674
+ > [woowahan-dino]
675
+ > *"이 동작에 대해서 생각해볼 필요가 있을 것 같아요. 현실에서는 카드뭉치에서 카드 한장을 꺼내서 플레이어가 받는다 라는 동작인데 이 코드를 보면 플레이어가 카드뭉치를 받고 거기서 카드를 받는 동작으로 보여요. 이 부분을 개선해보면 어떨까요?"*
676
+
677
+ → **현실 메타포 정합 어휘** — *MCP `oh-my-oop` 핵심 가치 (책임 분배 단계)*. PR #31·#21 결.
678
+
679
+ > [woowahan-dino]
680
+ > *"개발을 하다보면 가끔 반복문에 너무 의존하게 될 때가 있습니다. 우리가 만약에 1부터 10까지 합을 구한다고 하면 1부터 10까지 반복문을 돌리는 것을 먼저 떠올리게 됩니다. 하지만 그것보다 더 좋은 수학적인 방법이 존재합니다."*
681
+
682
+ → **반복문 의존 vs 수학적 풀이** 어휘. 외부글 동반.
683
+
684
+ > [parkjiminnnn 자가 답변]
685
+ > *"가지고 있는 ace카드의 개수만큼 반복문으로 카드를 힛하는 턴마다의 카드의 총합을 계산해서 ace카드의 점수를 유동적으로 바꿀 수 있다고 생각을 합니다.. 근데 반복문을 사용하지 않고 수학적인 방법으로만 턴마다 카드 점수의 총합을 유동적으로 계산하는건 어떻게 해야 할지 도저히 감이 안 잡히는데 힌트를 조금만 더 주실 수 있을까요?🥺"*
686
+
687
+ → **학생 자가 한계 인정 + 자가 힌트 요청** — *학습 적극성*. PR #95·#98·#46·#73·#36·#87 결.
688
+
689
+ > [woowahan-dino]
690
+ > *"미션을 하고 있는 프로젝트에서 model이라는게 domain관점인지 view관점인지가 중요할 것 같아요. domain 관점에서는 title이라는 view 관점의 값들이 들어있는게 맞을까? 라는 의문을 가져보면 어떨까요?"*
691
+
692
+ → **Model = domain vs view 의문 어휘** — *MVC 절대 원칙*.
693
+
694
+ > [woowahan-dino]
695
+ > *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까 MutableList를 만들지 않고 기존에 있는 List나 Array를 사용해서 만들어 보도록 해볼까요?"*
696
+
697
+ → **학습 의도 의식 어휘** — *미션의 학습 목표 의식*.
698
+
699
+ > [woowahan-dino]
700
+ > *"drawCount만 보면 카드를 뽑은 개수를 가져오는 것으로 느껴지는데 내부에서는 실제로 카드를 뽑을 수 있으면 카드를 뽑는 역할도 하고 있어요. 함수를 분리해볼 수 있지 않을까요?"*
701
+
702
+ → **CQS (Command-Query Separation) 어휘**.
703
+
704
+ > [parkjiminnnn 자가 답변]
705
+ > *"카드를 추가할 때마다 초기화 해줘야 해서 val로 선언하면 안될 것 같네용..🥲 함수명만 수정하겠습니당"*
706
+
707
+ → **학생 자가 부분 적용 + 부분 거절** — *val 으로 변환 거절 + 함수명만 적용*. **MCP `oop_propose_alternatives` 핵심 가치 (학생 자가 선택)** 합류.
708
+
709
+ reviewer 후속 (Thread 18):
710
+
711
+ > *"카드를 추가할 때 마다 새로운 값을 가져와야 한다면 `get() =` 을 사용하면 됩니다."*
712
+
713
+ → **reviewer 후속 답변 = 학생 자가 거절 이유 인정 + 대안 제시** — *3 가지 property 형태 안내*. **양방향 reviewer/학생 토론 정공**.
714
+
715
+ ## 얻은 교훈 (보편)
716
+
717
+ 1. **현실 메타포 정합 = 책임 분배 핵심** — *카드뭉치에서 카드 꺼내 플레이어 받는다* 같은 현실 동작 매핑. **MCP 룰 `metaphor-fidelity-locator` 강화** ⭐⭐⭐ (누적 8+ PR).
718
+
719
+ 2. **이름·의미 정확성 (함수 명명)** — *createCardRank/isHit/drawCount = 이름 vs 실제 동작 불일치*. **MCP 룰 `function-name-vs-return-semantic-mismatch` 강화** 누적 3+ PR.
720
+
721
+ 3. **property val vs computed property (`get()=`)** — *Kotlin 3 형태 (val 즉시 / get() 매 호출 / fun 명령형) 트레이드오프*. **MCP 룰 `property-val-vs-computed-property` 후보**.
722
+
723
+ 4. **Kotlin `by` delegation 권유 (PR #21 반대 시점)** — *delegation = Kotlin 어휘 정공* vs *PR #21 reviewer = 컬렉션처럼 쓰는 나쁜 습관*. **2 reviewer 의 반대 시점 = MCP `oop_propose_alternatives` 핵심 가치 합류 정점**.
724
+
725
+ 5. **반복문 의존 vs 수학적 풀이** — *Ace 1↔11 = while vs 단일 식*. 외부글 동반. **MCP 룰 `iterative-loop-vs-math-formula` 강화** ⭐⭐.
726
+
727
+ 6. **함수 합성 동치 = 추상화 의도 X** — *score - aceCount + aceCount = score = 함수 분리 비용만*. **MCP 룰 `function-decomposition-creates-identity` 후보**.
728
+
729
+ 7. **CQS (Command-Query Separation)** — *drawCount = count 가져옴 + 카드 뽑음 = 2 역할*. **MCP 룰 `command-query-separation` 후보**.
730
+
731
+ 8. **Stringly-typed → enum 비교** — *cardName.contains("A") → cardRank == ACE*. **MCP 룰 `stringly-typed-vs-enum-comparison` 후보**.
732
+
733
+ 9. **테스트 = 하드코드 검증 (production 코드 의존 X)** — *CardRank.values().size 의존 → 52 하드코드*. **MCP 룰 `test-hardcoded-vs-production-derived` 강화** 누적 3+ PR.
734
+
735
+ 10. **함수형 프로그래밍 학습 미션 어휘 (학습 목표 의식)** — *MutableList 회피 + Iterable 확장함수*. *학습 의도 의식*. **MCP 룰 `mutable-list-vs-functional-pipeline` 후보**.
736
+
737
+ 11. **Model = domain vs view (MVC 절대 원칙)** + **ViewMapper / 확장함수 2 안** — PR #21·#87 결 강화. **MCP 룰 `model-view-dependency-direction` 강화** ⭐⭐⭐.
738
+
739
+ 12. **`distinct()` vs `toSet()` 의도 = 순서 보존 여부** — **MCP 룰 `distinct-vs-toSet-intent` 후보**.
740
+
741
+ 13. **학생 자가 한계 인정 + 자가 힌트 요청** — *학습 적극성 모범*. *학습 = 시간 두고 반복* 어휘. PR #36·#87·#95·#98·#46·#73 결.
742
+
743
+ 14. **모든 25 스레드 학생 자가 답변 + 커밋 SHA 첨부** — *학생 자가 학습 가시화 정점*.
744
+
745
+ 15. **셀프 체크리스트 PR 본문 (2025 코호트 스타일)** — *체계화된 PR 본문 + 집중 리뷰 영역 명시*.
746
+
747
+ 16. **`protected` 자식 한정 가시성** — *Kotlin 어휘*. PR #87 결.
748
+
749
+ 17. **함수 인자 일관성** — *3 인자 중 1 만 외부 전달 = 비대칭*. **MCP 룰 `function-parameter-asymmetry` 후보**.
750
+
751
+ 18. **canHit 중복 호출 (Guard 중복)** — **MCP 룰 `redundant-guard-condition` 후보**.
752
+
753
+ 19. **클래스 이름과 멤버 이름 중복** — *Cards.cardsCount → Cards.count*. **MCP 룰 `member-name-includes-class-name` 후보**.
754
+
755
+ 20. **stateless 클래스 인스턴스화 vs companion object 정적** — *ScoreCalculator(cards) vs ScoreCalculator.calculate(cards)*. **MCP 룰 `stateless-class-vs-companion-object` 후보**.
756
+
757
+ 21. **부모 추상 메서드 반환 의미 자식 별 역방향** — *Dealer.turn = true (hit) vs Player.turn = true (종료)*. **MCP 룰 `method-return-semantic-asymmetry-between-subclasses` 후보**.
758
+
759
+ 22. **mutable 컬렉션 public 노출 (val MutableList)** — *backing property + 방어적 복사 정공*. **MCP 룰 `mutable-list-public-exposure` 강화** 누적 5+ PR.
760
+
761
+ 23. **양방향 reviewer/학생 토론 + 부분 거절 + reviewer 후속 답변** — *학생 자가 거절 이유 인정 + reviewer 대안 제시*. 누적 8+ PR.
762
+
763
+ ## 얻은 교훈 (도메인)
764
+
765
+ 1. **Ace 11 기본 + 수학적 단일 식** — `totalCardScore - 10 * aceCount.coerceAtMost((totalCardScore - BLACKJACK_SCORE) / 10 + 1)`. **MCP 룰 `ace-bonus-mathematical-vs-iterative` 후보**.
766
+
767
+ 2. **현실 메타포 = 카드뭉치에서 카드 꺼내서 플레이어 받는다** — *Player.receive(drawnCard: Card)* 정공.
768
+
769
+ 3. **Dealer 16 이하 자동 hit** — `DEALER_HIT_LIMIT = 16`. 블랙잭 표준 룰.
770
+
771
+ 4. **카드 중복 invariant + `toSet()` 검증** — *distinct() vs toSet() 의도 점검*.
772
+
773
+ 5. **VictoryStatus enum (WIN/LOSE/DRAW)** — *상수/문자열 → enum 변환*. PR #20·#28·#125 결.
774
+
775
+ 6. **`compareScores` `abs(BLACKJACK_SCORE - score)`** — *21에 가장 가까운 자가 승리 (블랙잭 룰 정확성)*. 다만 *블랙잭 표준 = bust 즉시 lose + 동점은 dealer 승*.
776
+
777
+ → **블랙잭 룰 와전 시점** — *abs 기반 비교* ≠ *21 정확 vs 21 미만 비교*. 학생 자가 점검 필요. **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 9+ PR.
778
+
779
+ ## MCP 룰 후보 신규 + 강화 (PR #117)
780
+
781
+ | 룰 | 신규 / 강화 | 누적 PR |
782
+ |---|---|---|
783
+ | `metaphor-fidelity-locator` | 강화 | 8+ ⭐⭐⭐ |
784
+ | `function-name-vs-return-semantic-mismatch` | 강화 | 3+ (#36·#117·#21) |
785
+ | `property-val-vs-computed-property` | 신규 | 1 (#117) — Kotlin 어휘 |
786
+ | `iterative-loop-vs-math-formula` | 강화 | 2+ (#117·#87) ⭐⭐ |
787
+ | `function-decomposition-creates-identity` | 신규 | 1 (#117) |
788
+ | `command-query-separation` | 신규 | 1 (#117) |
789
+ | `stringly-typed-vs-enum-comparison` | 신규 | 1 (#117) |
790
+ | `test-hardcoded-vs-production-derived` | 강화 | 3+ (#99·#26·#117) |
791
+ | `mutable-list-vs-functional-pipeline` | 신규 | 1 (#117) |
792
+ | `model-view-dependency-direction` | 강화 | 9+ ⭐⭐⭐ |
793
+ | `distinct-vs-toSet-intent` | 신규 | 1 (#117) |
794
+ | `function-parameter-asymmetry` | 신규 | 1 (#117) |
795
+ | `redundant-guard-condition` | 신규 | 1 (#117) |
796
+ | `member-name-includes-class-name` | 신규 | 1 (#117) |
797
+ | `stateless-class-vs-companion-object` | 신규 | 1 (#117) |
798
+ | `method-return-semantic-asymmetry-between-subclasses` | 신규 | 1 (#117) |
799
+ | `mutable-list-public-exposure` | 강화 | 5+ |
800
+ | `tuple-leak-vs-domain-dto` | 강화 | 3+ (#36·#87·#117) |
801
+ | `is-vs-can-prefix-semantics` | 신규 | 2+ (#117·#21) |
802
+ | `delegation-source-val-redundancy` | 신규 | 1 (#117) |
803
+ | `view-mapper-vs-extension-function` | 신규 | 1 (#117) |
804
+ | `decider-vs-tell-dont-ask` | 신규 | 1 (#117) |
805
+ | `ace-bonus-mathematical-vs-iterative` | 신규 | 1 (#117) — 도메인 특수 |
806
+ | `blackjack-rule-fidelity-comparison` | 강화 | 9+ ⭐⭐⭐ |
807
+
808
+ ## 메타 어휘 (13 reviewer + MCP 핵심 가치 합류 정점)
809
+
810
+ - ***woowahan-dino (디노) = 13번째 reviewer*** — *MCP 핵심 가치 어휘 합류*.
811
+ - ***현실 메타포 정합 어휘*** — woowahan-dino PR #117 — *"카드뭉치에서 카드 꺼내 플레이어 받는다"* — **MCP `oh-my-oop` 핵심 가치 (책임 분배 단계)**. PR #31·#21 결.
812
+ - ***학습 의도 의식 어휘*** — woowahan-dino PR #117 — *"이번에 함수형 프로그래밍에 대해 학습하는 미션이니까"* — *미션의 학습 목표 의식*.
813
+ - ***반복문 의존 vs 수학적 풀이*** — woowahan-dino PR #117 — *외부글 + 학생 자가 힌트 요청 + reviewer 후속 답변* 3 단계 학습 시점.
814
+ - ***Model = domain vs view 의문 어휘*** — woowahan-dino PR #117 — *MVC 절대 원칙*.
815
+ - ***학생 자가 부분 거절 + reviewer 후속 답변*** — parkjiminnnn / woowahan-dino — *학생 자가 거절 + reviewer 대안 제시* = **양방향 토론 정공**. PR #137·#151·#133·#146·#147·#87 결.
816
+ - ***모든 25 스레드 학생 자가 답변 + 커밋 SHA 첨부*** — parkjiminnnn — *학습 가시화 정점*.
817
+ - ***2025 코호트 스타일 (셀프 체크리스트 + 집중 리뷰 영역 명시)*** — *체계화된 PR 본문 + CI 자가 점검*. **2023·2024·2025 코호트 3 시기 합류**.
818
+
819
+ → **13 reviewer 누적 (말리빈/잭슨/페로로/지훈/krrong/vagabond95/BeokBeok/KwonDae/galcyurio/ghojeong/woowahan-leah/두루/woowahan-dino)** — *MCP `oh-my-oop` 핵심 가치 어휘 완전 합류 정점*.