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,57 @@
1
+ # PR #67 — [글로] 2단계 코틀린 자동차 경주 제출합니다
2
+
3
+ - **Reviewee:** [@ippnsj](https://github.com/ippnsj)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/67
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 21
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **의존성 주입 적용** — 리뷰어 명시적 칭찬.
12
+ - **`Cars` 일급 컬렉션 도입** — 자동차들의 책임 일급화.
13
+ - **자기 의문 적극 — split 검증 필요성, mutable 사용 이유 등**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`Controller`가 필드로 값을 보관** — 함수 인자로 받는 게 자연스러움.
18
+ - **for 루프 + map 결과 미사용** — repeat() / forEach 등 표준 도구 활용.
19
+ - **`CarMetadata` 모호한 이름** — Metadata는 추상 일반어, 도메인 의미가 없음.
20
+ - **`Car.isWinner(winnerDistance)`가 String 반환** — is- 접두사는 boolean 약속. 거짓말 시그니처.
21
+ - **Car의 `isLongerDistance` 같은 내부 비교** — distance를 비교의 일급 시민으로 노출하거나 distance 자체를 비교 가능하게.
22
+ - **자동차 이름의 Char 검증** — 다음 요구사항 변경에 대응 어려움. Regex로 일관 검증.
23
+ - **`Cars` 내부 mutableList** — 생성자에서만 사용한다면 List + 즉시 할당으로 immutable.
24
+ - **`CarNamesValidator` 외부 검증기** — 응집도 손상. 검증은 invariants 주인 곁.
25
+ - **테스트가 NumberGenerator를 직접 구현** — fun interface + 람다로 단순화.
26
+
27
+ ## 리뷰어 의견 요지
28
+
29
+ 리뷰어 @malibinYun는 **`is-` 접두사가 boolean을 약속한다** 는 클래식 가이드를 정밀히 짚었다. `isWinner(): String`이 호출자에게 거짓말.
30
+
31
+ 또한 **"비교 메서드의 trade-off"** — `isLongerDistance` 같은 메서드를 만들 것인가, `distance`를 public으로 열 것인가. 두 가지 모두 옵션이지만 메서드 이름으로 의도가 드러나야.
32
+
33
+ `Validator` 응집 가이드 + split 같은 단순 형식 변환은 View로 옮기는 가이드를 한 번 더 (1단계의 반복).
34
+
35
+ `mutableList` 사용에 대해서는 학생이 "add 함수 사용"이라 답했지만 리뷰어는 "생성 시 한 번에 할당하면 mutable 필요 없음"이라는 더 단순한 답.
36
+
37
+ - **대표 인용:**
38
+ > isWinner인데 String을 반환하는 것은 어색합니다. is~네이밍은 Boolean을 반환하는 것이 일반적이에요.
39
+ >
40
+ > — @malibinYun on `src/main/kotlin/domain/Car.kt`
41
+
42
+ > winnerDistance로 들어오는 integer 값이 반드시 승자의 값만 들어올까요? 다른 개발자들이 의도에 맞지 않게 사용하게 된다면, 전혀 다른 결과를 낼 것으로 보여요.
43
+ >
44
+ > — @malibinYun on `src/main/kotlin/domain/Car.kt:32`
45
+
46
+ > validator 객체를 따로 만들어 한꺼번에 관리하기 보다, 검증이 필요한 곳에서 해당 로직을 응집도 있게 구현하시면 좋겠어요.
47
+ >
48
+ > — @malibinYun on `src/main/kotlin/utils/CarNamesValidator.kt`
49
+
50
+ ## 얻은 교훈
51
+
52
+ - **`is-` 접두사 = boolean 약속.** 다른 타입 반환은 시그니처 거짓말. `isXxx`인데 String이면 `getXxx`로 바꾸거나 진짜 boolean으로.
53
+ - **`Manager`, `Metadata`, `Info` 같은 추상 명사는 도메인 어휘 부재의 신호.** 그 뒤에 진짜 도메인 개념이 있다 — `CarMetadata` → `RaceRecord` 같은 식.
54
+ - **파라미터 명명의 가정.** `winnerDistance: Int`라는 이름이 호출자에게 "승자의 distance만 넣어라"고 약속하지만 시그니처는 그것을 강제 못 함. 더 안전한 시그니처가 필요.
55
+ - **MutableList vs 즉시 할당 + List.** map { ... }의 결과를 한 번에 var/val에 할당하면 mutable 필요 없음. `add` 호출이 패턴화돼있으면 의식적 점검.
56
+ - **fun interface + 람다 = SAM의 가치.** NumberGenerator를 inner class로 구현하는 대신 람다로. 코드의 의도가 시그니처에 직결.
57
+ - **검증의 응집 원칙은 반복 강조 필요.** 1단계, 2단계 같은 가이드가 다시 나오면 학생이 흡수 못한 신호. 같은 코멘트가 반복되면 학습 깊이 점검.
@@ -0,0 +1,39 @@
1
+ # PR #110 — [자동차 경주 - 리팩토링] 재영 미션 제출합니다
2
+
3
+ - **Reviewee:** [@jaeyeongjo](https://github.com/jaeyeongjo)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/110
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **EOF, ktlintCheck 등 작은 위생 적용**.
12
+ - **runCatching, 재귀로 전환 완료**.
13
+ - **`MoveConstant` 의미별 상수 파일**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **GameController가 *class*** — 인스턴스화 필요성 의문 (object 가능).
18
+ - **assertTrue 같은 단조로운 assertion** — assertThat 등 가독성 좋은 옵션.
19
+
20
+ ## 리뷰어 의견 요지
21
+
22
+ 리뷰어 @Gyuil-Hwnag의 메시지:
23
+
24
+ 1. **Class vs Object 선택 이유** — "GameController를 Class로 구현함으로서 얻는 이점은?" 학생이 "여기서는 object로 바꾸는 게 좋겠다"로 답.
25
+
26
+ 2. **테스트 함수명 한국어 활용**.
27
+
28
+ 3. **assertTrue 외 다양한 assertion**.
29
+
30
+ - **대표 인용:**
31
+ > GameController를 Class로 구현함으로서 얻는 이점은 어떤 것이 있을까요?
32
+ >
33
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/controller/GameController.kt`
34
+
35
+ ## 얻은 교훈
36
+
37
+ - **"이걸 class로 한 이유는?" 질문이 가장 강력한 SRP 검증법**. 답을 못 하면 object/top-level fun으로 충분.
38
+ - **테스트 함수명 한국어 = 가독성 + 협업 친화**. 한국인 동료가 읽는 코드라면 영어보다 직관적.
39
+ - **assertThat이 assertTrue보다 *왜 실패했는지* 정보 풍부**. assertTrue는 boolean만, assertThat은 값/타입 차이.
@@ -0,0 +1,46 @@
1
+ # PR #89 — [자동차 경주 - 1단계] 재영 미션 제출합니다
2
+
3
+ - **Reviewee:** [@jaeyeongjo](https://github.com/jaeyeongjo)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/89
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 12
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **함수 분리 깔끔**, `Car.position` `private set`.
12
+ - **정규식 + Set 활용한 검증** (이름 형식, 중복).
13
+ - **try-catch 처리 깔끔**.
14
+ - **`ValidationUtil`을 Car 외부로 분리** + 학생이 *이유* 답변 (SRP).
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **while문이 흐름 제어로만 쓰임 (조건 무의미)**.
19
+ - **nullable + `!!` 사용** — non-null로 끌어올리기 가능.
20
+ - **runCatching 미적용** (try-catch).
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @Gyuil-Hwnag의 메시지:
25
+
26
+ 1. **while문의 조건 의미 퇴색** — 단순 무한 루프 + break면 while의 의미 무. → 학생 재귀로 변경.
27
+
28
+ 2. **`!!` 회피의 두 방향**:
29
+ - 입력 단계에서 nullable 제거 (`orEmpty()`, `?: ""`)
30
+ - 함수 시그니처 non-null로
31
+
32
+ 3. **runCatching의 *extension* (`onSuccess`, `onFailure`)** 활용.
33
+
34
+ 4. **검증을 별도 클래스로 분리 = SRP 정당화** — 학생 답: "Car의 책임은 상태 관리 + 행위 캡슐화. 검증은 또 다른 책임."
35
+
36
+ - **대표 인용:**
37
+ > nullable한 값에 대해서 !!로 non-nullable 하게 정의하는 방법도 좋지만 nullable한 요소를 제거해 보는건 어떨까요?? nullable한 코드 마다 매번 non-nullable 하게 정의하는 것과 try catch로 감싸는 내용이 들어가다 보면 보일러 플레이트 코드가 생겨날 것 같다는 생각이 듭니다!
38
+ >
39
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/controller/GameController.kt`
40
+
41
+ ## 얻은 교훈
42
+
43
+ - **`!!`은 *코틀린의 마지막 수단***. 보통은 입력 단계에서 null을 *제거*해서 호출 측은 non-null만 다루는 게 깨끗.
44
+ - **while문의 조건이 무의미하면 while 아님**. 재귀 또는 do-while로 바꾸는 게 흐름 명시적.
45
+ - **SRP의 자가 답변 = 학습의 신호**. "Car의 책임은 상태 + 행위. 검증은 또 다른 책임"이라는 *명확한 한 문장*이 있으면 분리 정당화.
46
+ - **runCatching의 진짜 가치 = Extension 체이닝** (`onSuccess`/`onFailure`). try-catch는 명령형, runCatching은 선언형.
@@ -0,0 +1,49 @@
1
+ # PR #104 — [자동차 경주] 누누 미션 제출합니다
2
+
3
+ - **Reviewee:** [@jinuemong](https://github.com/jinuemong)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/104
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @KwonDae
7
+ - **라인 코멘트:** 11
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **enum class 활용**, `require`/`throw` 잘 적용.
12
+ - **`Validator` 객체, `Constant` 분리**.
13
+ - **PR에 자가 의문 명시** — 재귀 vs lateinit + while 비교.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`Application`이 OutputView/InputView/Validator 인스턴스 보유** — object 후보.
18
+ - **`Car.step`을 생성자로 받음** — 0으로 초기화되는 값이 외부 인자.
19
+ - **`InputView`에 출력문 (안내 메시지)** — 출력 책임 침범.
20
+ - **`Message` object에 모든 메시지 모음** — 재사용 안 되면 사용처에 둘 것.
21
+ - **separator 같은 매직 문자열 미상수화**.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 리뷰어 @KwonDae의 메시지:
26
+
27
+ 1. **재귀 vs lateinit + while** — "정답은 없다. 다만 lateinit은 *non-nullable 타입을 생성자 외부에서 초기화*하기 위해 쓰는 도구. *초기화 상태*를 체크하는 용도는 부적절."
28
+
29
+ 2. **`step`을 *body에 두기*** — 생성자가 받을 게 아니라 항상 0으로 시작하는 invariant.
30
+
31
+ 3. **InputView가 출력문을 보유 = 책임 침범**.
32
+
33
+ 4. **상수의 자리 = 사용처와의 거리**. 재사용 안 되면 사용처 내부에 private.
34
+
35
+ - **대표 인용:**
36
+ > 누누님이 말씀하신 케이스에서의 `초기화 상태`를 체크하는 용도로 lateinit 사용이 적절할지는 한번 고민해볼 필요는 있을것 같아요. 상태를 관리하는 객체가 따로 존재하지 않은 대신, lateinit 으로 관리되는 상태를 사용할 때 `상태 = 변수 초기화 유무` 이 둘의 상관관계가 자연스러운가? 에 대해 고민해보시기 바랄게요!
37
+ >
38
+ > — @KwonDae on `src/main/kotlin/racingcar/controller/CarController.kt`
39
+
40
+ > step 을 생성자로 받아야 할 필요가 있을까요? step은 처음 Car 클래스가 생성될 때 0으로 초기화 되고, 함수를 통해 변경되는 값이기에 constructor 보다는 body에서 관리되는게 어떨가 싶은데요.
41
+ >
42
+ > — @KwonDae on `src/main/kotlin/racingcar/model/Car.kt`
43
+
44
+ ## 얻은 교훈
45
+
46
+ - **`lateinit`의 진짜 용도 = "non-nullable 타입 + 생성자 외부 초기화"**. 초기화 *여부*를 흐름 제어로 쓰는 건 부적절. *상태 = 변수 초기화 유무*의 매핑이 부자연스러우면 다른 도구.
47
+ - **생성자 vs body 선언 기준**: 외부에서 주는 값 → 생성자, 항상 같은 초기값으로 시작하는 invariant → body.
48
+ - **InputView에 출력문 = 책임 침범**. 입출력 분리 의미 약화. 입력 안내문도 OutputView로.
49
+ - **상수의 응집도 = 재사용성**. 한 클래스에서만 = 그 클래스 내 private. 여러 클래스 = 의미 있는 파일.
@@ -0,0 +1,42 @@
1
+ # PR #117 — [자동차 경주 - 리팩토링] 누누 미션 제출합니다
2
+
3
+ - **Reviewee:** [@jinuemong](https://github.com/jinuemong)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/117
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @KwonDae
7
+ - **라인 코멘트:** 5
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`RandomNumberMaker` 인터페이스 도입** — 전략 패턴.
12
+ - **검증 + 변환을 한 함수로** — `validateCarNames`가 검증 후 `List<Name>` 반환.
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ - **Car가 여전히 `Random` 직접 의존** — 부분적 적용.
17
+ - **인터페이스의 패키지 위치** — domain vs data 의문 (리뷰어 가이드 필요).
18
+
19
+ ## 리뷰어 의견 요지
20
+
21
+ 리뷰어 @KwonDae의 메시지:
22
+
23
+ 1. **Validator의 *검증 + 반환* 패턴** — "Validator는 검증, 이상 시 catch, 정상 시 List 반환 → kotlin.collections.filter와 유사." 흐름이 깔끔해짐.
24
+
25
+ 2. **인터페이스 위치 = domain, 구현체 위치 = data**. "RandomNumberMaker 인터페이스가 domain에 있고, RandomNumberMakerProvider 같은 구현이 데이터 영역에 있으면 자연스럽다." 의존 역전.
26
+
27
+ 3. **Random 의존 분리** — Car가 직접 Random.nextInt 부르면 테스트 어려움.
28
+
29
+ - **대표 인용:**
30
+ > 오히려 검증 후 이상없다면 List<Names> 를 반환하는게 어떨까 해서 코멘트 드렸었습니다. Validator는 말그대로 검증하는 로직이기에, 검증시 이상있으면 catch에서 처리될 것이고, 정상이라면 List를 반환하도록 하여 가독성을 더 높일 수 있다는 말씀을 드리고 싶었습니다 👍 마치 kotlin.collections 의 filter 처럼요
31
+ >
32
+ > — @KwonDae on `src/main/kotlin/racingcar/controller/CarController.kt`
33
+
34
+ > 오히려 RandomNumberMarker 인터페이스가 domain 패키지에 있고, 이를 구현하는 ex. RandomNumberMarkerProvider 가 데이터영역에 있으면 조금 더 자연스럽겠네요!
35
+ >
36
+ > — @KwonDae on `src/main/kotlin/racingcar/data/RandomNumberMaker.kt`
37
+
38
+ ## 얻은 교훈
39
+
40
+ - **Validator의 `검증 + 변환`은 *kotlin.collections.filter* 패턴**. 검증만 하고 boolean 반환 vs 정상 시 변환된 값 반환. 후자가 호출 측 가독성 높음.
41
+ - **인터페이스 = domain, 구현체 = data/infra**. 의존 역전 원칙. 도메인이 외부를 모르고, 외부가 도메인 인터페이스에 의존.
42
+ - **부분 적용된 추상화의 위험**. RandomNumberMaker 인터페이스 만들었지만 Car가 여전히 Random 직접 부르면 추상화의 절반만 적용. 일관성이 중요.
@@ -0,0 +1,59 @@
1
+ # PR #142 — [자동차 경주] 포르 미션 제출합니다
2
+
3
+ - **Reviewee:** [@jiyuneel](https://github.com/jiyuneel)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/142
5
+ - **단계:** 2단계 (단일 PR)
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 25
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Game` 도메인 객체 도입** — 게임 진행 로직을 별도 객체로 분리.
12
+ - **`Validator` 별도 클래스** — CarNamesValidator, InputValidator로 분리.
13
+ - **Retry 유틸리티 분리** — 입력 재시도 로직 일반화.
14
+ - **enum `Move`** — 매직넘버 대신 enum.
15
+ - **피드백 흡수 후 도메인 검증을 Car init으로 이동** — Validator → Car 자체로.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ - **검증을 모두 Validator/Controller에 모음** — Car init 검증과 분리되어 책임 분산.
20
+ - **`CarNamesValidator` 분리로 Car 테스트가 빈약해짐** — 테스트가 Validator로 옮겨가니 Car는 "move/distance"만 테스트, 도메인 무결성 테스트는 Validator만.
21
+ - **`Car`의 가변성 (var position) vs `copy` 토론에서 결론 미정** — "mutable해도 되긴 하는데"로 끝남.
22
+ - **View가 NotEmpty 같은 사용자 입력 형식 검증을 안 함** — 빈 문자열도 Controller까지 옴.
23
+ - **`InputValidator` 같은 일반 이름** — 다른 게임 추가 시 충돌 가능성 (리뷰어 지적).
24
+ - **테스트 네이밍에 given/when/then 구분 미흡** — 30줄 넘는 테스트에서 가독성 저하.
25
+
26
+ ## 리뷰어 의견 요지
27
+
28
+ 리뷰어 @Gyuil-Hwnag은 **"확장 시나리오로 압박 테스트하기"** 스타일.
29
+
30
+ 1. **Validator의 확장 압박** — "KoreanCar, EnglishCar, FrenchCar가 늘어나도 모국어만 쓴다면 Validation이 너무 무거워진다" → Validator가 한 클래스에 도메인별 규칙을 다 안고 있을 때 깨짐.
31
+
32
+ 2. **Validator의 위치** — "ValidationCheck가 과연 Controller에서 담당해야 할 일인가?" → 학생이 "도메인 검증은 Car init으로 이동, 사용자 입력(빈 문자열)은 Controller에 남김"으로 답.
33
+
34
+ 3. **Retry의 실서비스 사용처 질문** — "이 로직은 실서비스에서 언제 쓸 거냐?" → "API 호출 재시도" 답 유도. 추가 "onFailure 시에는 무조건 재호출일까요?" → Retry 정책의 세분화 (재시도 횟수, 백오프, 종류별 분기) 시사.
35
+
36
+ 4. **mutable data class 토론** — "RacingCar는 mutable해도 되지만, 실서비스에서는 사이드이펙트 영향 추적 어렵다. 멀티스레드 동시성도." → 학생은 "구체적 케이스 더 공부할 것" 인정.
37
+
38
+ 5. **테스트 네이밍 핵심** — "주어진 것 / 동작 / 예상 결과를 구분해서 적는다" → given-when-then 구조. 단순 한 줄짜리 fun 이름이 아닌, body 안에서도 구분.
39
+
40
+ - **대표 인용:**
41
+ > KoreanCar, EnglishCar, FrenchCar 등등 Car 객체가 늘어나도 해당 Car들은 모국어만 사용할 수 있다고 한다면, Validation이 너무 무거워질 것 같네요.. 또한 구현을 보면서 계속 의문이 들었던 것은 ValidationCheck가 과연 Controller에서 담당을 해야할 일인가?? 인데
42
+ >
43
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/controller/RacingCarController.kt`
44
+
45
+ > 레이싱 게임에서의 Car 객체는 많은 로직이나, 복잡한 유기성을 가지고 있지 않아서 mutable 하게 해도 크게 문제는 안되지만 실제 프로젝트에서는 어떤 영향을 줄지는 알 수가 없는 경우가 많습니다!
46
+ >
47
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/model/Car.kt:6`
48
+
49
+ > 이왕 재실행하는 로직을 만드셨으니, 코멘트 남겨두었습니다! 실제 서비스에서 이 로직은 언제 사용을 하실건가요? (사용한다면, 어떤 부분을 수정하는 것이 좋을지도요!)
50
+ >
51
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/util/Retry.kt:11`
52
+
53
+ ## 얻은 교훈
54
+
55
+ - **"확장 시나리오로 압박"이 강력한 리뷰 기법.** 지금 잘 돌아가는 Validator가 도메인 확장(다국어 차, 다게임)에 무너지는지 시뮬레이션 → 진짜 책임 분배를 강제.
56
+ - **유틸리티 함수의 가치 = 실서비스 사용처가 명확할 때.** Retry는 만들기 쉬워도 "언제 어떻게 쓰일지" 답이 없으면 죽은 코드. 만들기 전 "이게 어디서 쓰일까?"를 자문.
57
+ - **검증 책임의 3단 분리.** UI 형식 검증 = View (빈 문자열, 공백), 사용자 입력 정책 = Controller (재입력 흐름), 도메인 무결성 = Domain init (이름 길이 같은 invariant).
58
+ - **mutable의 진짜 위험은 "테스트 가능한 작은 코드"가 아니라 "추적 못 하는 큰 코드"에서 나타난다.** Racing처럼 작은 도메인에서는 mutable로도 충분히 동작 — 다만 "큰 코드에서 깨지는 패턴을 작은 코드에서 연습한다"가 학습의 목적.
59
+ - **테스트 네이밍은 함수 이름만이 아니라 body 안의 given/when/then 구분 주석/공백.** 30줄짜리 테스트에서 어디까지가 setup인지 보이게.
@@ -0,0 +1,41 @@
1
+ # PR #113 — [자동차 경주 - 리팩토링] 에디 미션 제출합니다
2
+
3
+ - **Reviewee:** [@junjange](https://github.com/junjange)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/113
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 10
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`RandomNumber`를 object로 (싱글톤)** + 학생이 *왜* 그렇게 했는지 정당화 — 게임이 여러 번 진행돼도 인스턴스 재생성 비용 없음.
12
+ - **`RandomNumberGenerator` 인터페이스 도입** — 리뷰어 권고 즉시 흡수.
13
+ - **테스트 함수명 한국어로 가독성 ↑**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **테스트 매직넘버 (3, 4) → 의미 상수 (이동_성공, 이동_실패) 미적용**.
18
+ - **`RandomNumber` 단일 object** — 인터페이스 추상화 전.
19
+
20
+ ## 리뷰어 의견 요지
21
+
22
+ 리뷰어 @Gyuil-Hwnag의 메시지:
23
+
24
+ 1. **object로 만든 *이유* 명시 요구** — 학생이 "랜덤 생성이 자주 호출되어 인스턴스 재생성 비용 회피"로 답.
25
+ 2. **확장성 위해 interface 추상화** — 학생이 즉시 적용.
26
+ 3. **테스트 매직넘버에 의미 부여** — `MOVE_SUCCESS = 4`, `MOVE_FAIL = 3` 같은 의미 상수.
27
+
28
+ - **대표 인용:**
29
+ > RandonNumber를 object 키워드로 생성하신 이유가 궁금합니다!
30
+ >
31
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/utils/RandomNumber.kt`
32
+
33
+ > RandomNumber에 대한 확장성을 위해서 interface로 만드는 방법도 고민해보면 좋을 것 같습니다!!
34
+ >
35
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/utils/RandomNumber.kt`
36
+
37
+ ## 얻은 교훈
38
+
39
+ - **object 사용 정당화 = 인스턴스 비용 vs 상태 무**. "비용 회피"가 정당화이지, "그냥 한 줄 짧아서"가 아님.
40
+ - **테스트 매직넘버도 도메인 어휘**. 4와 3이 의미하는 *상황*에 이름을 붙이면 테스트 본문이 영어 문장으로 읽힘.
41
+ - **interface 추상화 시점 = 확장성 *예상*되는 시점**. 지금 한 구현체밖에 없어도, 미래 확장이 명확하면 인터페이스로.
@@ -0,0 +1,39 @@
1
+ # PR #87 — [자동차 경주 - 1단계] 에디 미션 제출합니다
2
+
3
+ - **Reviewee:** [@junjange](https://github.com/junjange)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/87
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @Gyuil-Hwnag
7
+ - **라인 코멘트:** 14
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`RacingCarGame` model + companion object 상수**.
12
+ - **String 확장 함수 활용** — 코틀린 idiom.
13
+ - **`Exceptions` object로 검증 분리** — 확장 함수 형태로 InputView에서 호출.
14
+ - **private 지정자 의식적 사용**.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`MESSAGE_ERROR` 상수가 public** — Exceptions 내부에서만 쓰이는데도.
19
+ - **JVM target 19 (관습은 17)** — 의미 없는 차이.
20
+ - **함수 분리 부족** — `setCarNames + setRound` 형태로 SRP 강화 가능.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @Gyuil-Hwnag의 메시지:
25
+
26
+ 1. **상수의 private 권장** — Exception 메시지처럼 클래스 내부에서만 쓰는 상수는 private. "사람이 실수할 수 있는 상황에 대비."
27
+ 2. **함수 분리 SRP** — `initRacingCar()` 같은 작은 단위.
28
+ 3. **테스트 함수명 한국어 + given/when/result 주석**.
29
+
30
+ - **대표 인용:**
31
+ > MESSAGE_ERROR 같은 경우에도 Exception 에서만 사용하는 상수라면 private로 외부 접근을 막는 것도 좋을 것 같습니다!! 추후에 규모가 커지다 보면 중복으로 선언하는 상수가 생길 수도 있으며, 외부에서도 접근이 가능하게 됩니다. 사람이다 보니 언제든 실수할 수 있는 상황에 대비해서 고려해보셔도 좋을 것 같습니다
32
+ >
33
+ > — @Gyuil-Hwnag on `src/main/kotlin/racingcar/utils/Exceptions.kt`
34
+
35
+ ## 얻은 교훈
36
+
37
+ - **private의 가치 = 미래의 실수 차단**. 외부 접근 가능한 상수는 누군가 중복 선언/잘못 import할 신호. 처음부터 private으로 막으면 그 위험 0.
38
+ - **확장 함수로 검증 호출 = 호출 측 가독성 ↑**. `input.validate()` 형태가 `Exceptions.validate(input)`보다 읽기 좋음. 단, 확장 함수가 어디서 정의됐는지 추적 부담은 있음.
39
+ - **의미 없는 선택의 정당화는 정직하게**. JVM target 19로 한 이유 = "그냥". 그걸 *PR에 적는 정직함*이 동료가 신뢰하는 신호.
@@ -0,0 +1,52 @@
1
+ # PR #148 — [자동차 경주 구현] 공백 미션 제출합니다
2
+
3
+ - **Reviewee:** [@junseo511](https://github.com/junseo511)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/148
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 32
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Car 생성 시 init 블록에서 자기 invariants 검증** — 이름 빈 값/길이 검증을 `Car` 스스로 책임. 도메인 객체가 자기 무결성을 지키는 방향.
12
+ - **`Judge` 분리 시도** — 우승자 판별을 별도 객체로 빼서 책임 분할 의식을 보여줌. (다만 그게 정말 별도 객체여야 하는지가 토론거리)
13
+ - **ParameterizedTest 활용** — 같은 형태의 케이스를 데이터로 묶어 표현.
14
+ - **자기 의문을 명시적으로 기록** — "유효성 검증의 책임은 누가 가지고 있는가" 같은 메타 질문을 PR description에 적어 토론을 유도.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`Judge`의 정체성 모호 — "자동차들"에게 직접 메시지를 던질 수도 있는 세계** — 현실 비유로는 심판이 맞지만, 객체지향에서는 "Cars 자신이 너네 중 우승자를 내놔"라고 응답할 수 있음. 책임 분리가 항상 새 객체를 의미하지는 않음.
19
+ - **`Organizer`라는 모호한 클래스 이름** — 무엇을 organize하는지 이름만으로 짐작 불가. "RaceOrganizer"로 보강했지만 여전히 추상.
20
+ - **`RandomGenerator`를 게임 실행마다 생성** — 한 번 만들면 재사용 가능한데 매번 생성해 객체 라이프사이클 인식이 약함.
21
+ - **공백 = " "만 공백으로 인식** — 탭/줄바꿈 등 다른 whitespace는 잡지 못함. 도메인 무결성 정의가 좁음.
22
+ - **테스트가 예외 종류만 보고 메시지/원인을 검증 안 함** — 같은 IllegalArgumentException이라도 진짜 그 원인으로 실패했는지 확신 불가.
23
+
24
+ ## 리뷰어 의견 요지
25
+
26
+ 리뷰어 @malibinYun는 두 가지 주요 관점을 일관되게 짚었다.
27
+
28
+ 1. **"객체에게 메시지를 던지는 것"** 이 현실 비유와 다를 수 있다는 점 — `Judge`로 분리하기 전에 `Cars`(자동차들) 컬렉션 자체에 "너희 중 우승자를 내놔" 메시지를 보낼 수 있는지 고민.
29
+ 2. **이름은 추측이 가능해야 한다** — `Organizer`만 보고 어떤 프로그램인지 짐작이 안 됨. "동료에게 이름만 보여주고 역할을 맞춰보게 한다"는 검증 방법까지 제시.
30
+
31
+ 또 테스트에서 **"같은 예외 종류 안에서 진짜 그 원인으로 실패했는지"** 를 묻는 식의 비판은 예외 검증 설계의 깊이를 끌어올림.
32
+
33
+ - **대표 인용:**
34
+ > "자동차들"에게 직접 "너네 중 승자를 내놔" 라고 메시지를 던져보는 게 가능한 세계라는 점, 참고해보세요!
35
+ >
36
+ > — @malibinYun on `src/main/kotlin/Judge.kt`
37
+
38
+ > 아무 동료를 붙잡고 RaceOrganizer라는 이름만 가지고 어떤 역할을 할 것 같냐고 물어보면 객관적인 검증이 되겠어요!
39
+ >
40
+ > — @malibinYun on `src/main/kotlin/Organizer.kt`
41
+
42
+ > 공백 케이스를 테스트했는데, IllegalArgumentException가 throw되어 테스트를 성공했을 때, 정말 공백에 대한 IllegalArgumentException임을 확신할 수 있을까요?
43
+ >
44
+ > — @malibinYun on `src/test/kotlin/CarTest.kt:19`
45
+
46
+ ## 얻은 교훈
47
+
48
+ - **"분리 = 새 객체"가 항상 답은 아니다.** 우승자 판별은 `Judge`라는 새 객체가 아니라, `Cars`라는 일급 컬렉션 자신의 책임이 될 수 있다. 객체지향에서는 "컬렉션도 메시지를 받을 수 있다"는 점이 절차적 사고와 다른 결정적 차이.
49
+ - **이름은 외부 검증으로 평가하라.** 그 이름만 보고 동료가 책임을 추측할 수 있어야 한다. 만약 "이건 OO이고 OO은 안 한다"고 보충 설명이 필요하다면, 이름이 책임을 못 드러내는 신호다.
50
+ - **객체의 생애 주기는 사용 패턴이 결정한다.** 매 호출마다 생성되는 자원은 (1) 정말 그래야 하는지, (2) 재사용해도 안전한지 한 번 더 검토할 것. 게임 단위 = 1개라면 멤버로 보관.
51
+ - **도메인 무결성의 정의는 도메인의 어휘로 한다.** "공백 = space"가 아니라 "이름으로 인식할 수 없는 모든 whitespace"가 더 정확한 invariants.
52
+ - **예외 검증의 신뢰도는 종류 + 원인.** 같은 예외 타입 안에서 의도와 다른 이유로 실패하면 테스트가 거짓말을 한다. 메시지 검증이 부담스럽다면, 다른 예외 클래스를 도메인 별로 분리하는 것도 방법.
@@ -0,0 +1,51 @@
1
+ # PR #165 — [자동차 경주 2단계] 공백 미션 제출합니다
2
+
3
+ - **Reviewee:** [@junseo511](https://github.com/junseo511)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/165
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 23
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Cars` 일급 컬렉션으로 자동차들의 책임 모음** — `Judge`를 따로 두기보다 `Cars`에게 "우승자 골라"라는 메시지를 보내는 방향으로 1단계 피드백 흡수.
12
+ - **`Car` 자체는 군더더기 없이 깔끔** — 리뷰어가 명시적으로 칭찬. 도메인 객체가 자기 책임만 들고 있음.
13
+ - **이름 중복 검증을 `Cars.init`으로 이동** — invariants가 그 invariants의 주인 곁에 위치.
14
+ - **`Race` 객체 도입** — Controller가 라운드 흐름을 직접 돌리던 것을 도메인 객체로 옮기려는 시도.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`Race`라는 이름이 여전히 추상적** — "경주"라는 단어가 광범위해 구체적 책임이 안 드러남. `RacingGame`/`CarRace` 같은 더 구체적 명명 필요.
19
+ - **`Race`가 `Cars`에서 cars를 꺼내 직접 다룸** — 디미터의 법칙 위반. `cars.getX()`로 데이터를 꺼내 사용 → 메시지 위임으로 바꿔야.
20
+ - **`moveCars`가 여전히 테스트하기 어려운 형태** — 1단계의 `Car`에는 적용한 "결정적 입력 주입"이 `Cars` 메서드에는 적용 안 됨. 같은 원칙의 일관성 부족.
21
+ - **`Cars.toWinners()`가 수신 객체를 변환한다는 오해 유발** — `to-` 접두사가 새 객체 변환을 의미하는데 사실은 필터 결과. 이름이 동작과 어긋남.
22
+ - **Controller가 여전히 라운드 진행 흐름을 손에 쥠** — `Race` 객체가 도입됐지만 흐름 제어가 완전히 이전되지 않음.
23
+ - **테스트가 목적이 모호** — "1회 또는 2회 실행 후 상태"가 어떠해야 하는지 명확히 검증 안 함.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @malibinYun는 이 라운드에서 **객체의 자율성**을 강하게 밀어붙였다. Controller가 라운드 루프를 돌리는 게 아니라 **`Race` 객체에게 startGame()을 보내면 결과 객체가 돌아오는** 형태가 객체지향다움이라는 가이드. 동시에 **디미터의 법칙**을 명시적으로 언급하며 `Cars`에서 cars를 꺼내쓰는 패턴을 지적.
28
+
29
+ 또한 이름이 행동을 거짓말하는 케이스(`toWinners`가 변환이 아니라 필터)와, `Race`같은 너무 일반적 이름의 문제를 짚었다.
30
+
31
+ - **대표 인용:**
32
+ > 경주 객체에게 게임을 시작하라고 하면, 진행한 모든 라운드의 기록을 담은 객체를 반환하고, 그 기록을 바탕으로 View를 그려주는 형태로 구성해볼 수 있겠어요. 그러면 더이상 컨트롤러에서 자동차 경주 게임의 흐름 제어를 맡지 않고, 경주 객체 자체가 자율성을 지니겠지요!
33
+ >
34
+ > — @malibinYun on `src/main/kotlin/racingcar/model/Race.kt:20`
35
+
36
+ > Cars 객체에서 cars를 꺼내 쓰기 보다, 메시지를 던져 값을 가져오는 건 어떨까요? 디미터의 법칙에 대해서도 알아보셔도 좋겠어요.
37
+ >
38
+ > — @malibinYun on `src/main/kotlin/racingcar/model/Race.kt:21`
39
+
40
+ > 이 메서드 명으로 보면, 수신 객체를 모두 승리한 자동차로 바꾸겠다는 의미로 느껴지네요.
41
+ >
42
+ > — @malibinYun on `src/main/kotlin/domain/Cars.kt` (`toWinners`)
43
+
44
+ ## 얻은 교훈
45
+
46
+ - **객체의 자율성 = 흐름 제어를 객체가 들고 있는 것.** Controller가 라운드 루프를 돌면 그 객체는 데이터 컨테이너에 불과해진다. `Race.startGame()`이 결과 객체를 반환하는 형태가 객체에게 "스스로 일하라"고 시키는 모양.
47
+ - **디미터의 법칙 = "친구의 친구의 메서드를 부르지 않는다".** `cars.getCars()[i].position`처럼 객체 그래프를 타고 내려가는 호출은 캡슐화를 뚫고 들어가는 신호. 한 메시지로 결과를 받게 시그니처를 다시 디자인.
48
+ - **메서드 이름은 동작을 거짓말하면 안 된다.** `to-` 접두사가 변환을 의미한다면, 필터 결과에는 `to-`를 붙이지 않는다. 사용자의 기대를 어기지 않는 약속을 유지.
49
+ - **추상적 이름은 그것이 일반화의 결과일 때만 가치 있다.** `Race`가 자동차 외에도 적용될 일반화라면 OK, 아니면 `CarRace`로 구체화. 이름이 의도를 좁힐 때 더 강력하다.
50
+ - **같은 원칙은 같은 수준에서 적용한다.** `Car`를 결정적 입력으로 테스트 가능하게 만들었다면, 같은 패턴을 `Cars.moveCars`에도 적용해야 한다. 한 군데만 깨끗하면 다른 곳에 비결정성이 흘러들어간다.
51
+ - **테스트는 동작의 명세 — "무엇이 어때야 하는가"가 명확해야 한다.** "1회 실행" 자체가 아니라 "1회 실행 후 자동차 상태가 어떠해야 하는가"가 테스트의 본질.
@@ -0,0 +1,55 @@
1
+ # PR #32 — [토마스] 코틀린 자동차 경주 제출합니다
2
+
3
+ - **Reviewee:** [@ki960213](https://github.com/ki960213)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/32
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 10
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`GameCars` 일급 컬렉션 도입** — 자동차들의 책임 일급화.
12
+ - **자기 의문 표명 + 자기 정당화** — Set vs List 선택의 자기 분석.
13
+ - **시도 횟수 검증의 모범 — `AdvanceCount`** — 원시 강박 해소.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`Regex`를 매번 생성** — invariant 객체는 캐싱.
18
+ - **에러 메시지에 입력값 포함 안 됨** — 디버깅/UX 미흡.
19
+ - **`common.Const`로 에러 prefix 같은 미미한 상수 모음** — 분리의 정당화 약함.
20
+ - **`Car`가 data class 아닌 그냥 class** — equals/hashCode 자동 생성 활용 가능.
21
+ - **매직 넘버 인라인** (`GameCars` 등).
22
+ - **`InputView`가 Car 생성** — 도메인 객체 생성 책임이 View로.
23
+ - **`main.kt`에 전역 변수** — 객체 간 데이터 흐름이 흐려짐.
24
+ - **`runCatching` 구문 길어 어디서 exception 발생하는지 모호**.
25
+ - **테스트가 production 로직으로 데이터 빌드** — 변경 약함.
26
+ - **NumberGenerator 인터페이스를 SAM 람다로 활용 안 함**.
27
+
28
+ ## 리뷰어 의견 요지
29
+
30
+ 리뷰어 @malibinYun는 **테스트 메시지 검증의 trade-off** 에 대한 학생의 self-정당화에 대해 **"여러 제안 중 본인의 것으로 흡수"** 라는 메타 가이드. 학생의 추론(거짓 양성/음성)을 인정하면서도 다른 시각을 제시.
31
+
32
+ 또한 **`GameCars`의 Set vs List 선택** 에 대해 단순 답이 아닌 trade-off 정리: List 받고 검증 후 Exception / Set 활용으로 중복 없는 도메인 / 내부에서 Set만 사용. 모두 가능한 선택.
33
+
34
+ **`runCatching` 구문이 길면 어디서 exception 발생하는지 모호** — 함수 분리로 명확.
35
+
36
+ - **대표 인용:**
37
+ > 여러 제안에 대해서 충분히 고민해보시고, 장단점과 특징을 잘 공부해서 본인의 것으로 잘 흡수했으면 좋겠어요.
38
+ >
39
+ > — @malibinYun on `src/main/kotlin/domain/GameCars.kt`
40
+
41
+ > runCatching 구문이 길어지면 어디에서 exception이 발생하는 지 알기 어렵습니다.
42
+ >
43
+ > — @malibinYun on `src/main/kotlin/main.kt`
44
+
45
+ > Car를 만들어내는 일은 View의 일일까요?
46
+ >
47
+ > — @malibinYun on `src/main/kotlin/view/InputView.kt:26`
48
+
49
+ ## 얻은 교훈
50
+
51
+ - **invariant 객체는 매번 생성하지 않는다.** Regex 같은 비용 큰 객체는 companion에서 한 번만.
52
+ - **상수 분리의 정당화 = 도메인적 의미.** "에러 메시지 prefix"는 도메인 의미가 약함. 분리는 의미가 있을 때만.
53
+ - **runCatching의 범위.** 한 번에 너무 많이 잡으면 어디서 던졌는지 모름. 단일 호출 또는 짧은 블록에만.
54
+ - **Set vs List vs 검증 후 List = trade-off.** 정답 없는 선택, 각각 장단점. 자기 결정의 이유가 학습.
55
+ - **테스트 메시지 검증의 trade-off.** 메시지 포함 검사 vs 정확 일치 검사 — 변경 가능성 vs 검증 정확도. 학생의 판단 인정.
@@ -0,0 +1,51 @@
1
+ # PR #63 — [토마스] 2단계 자동차 경주 제출합니다
2
+
3
+ - **Reviewee:** [@ki960213](https://github.com/ki960213)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/63
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 22 (1단계와 거의 동일한 리뷰 반복 — 학습 누적 신호 약함)
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`AdvanceCount` 도메인 객체 도입 + require 활용**.
12
+ - **`GameCars` 일급 컬렉션 유지**.
13
+ - **자기 결정의 정당화 능력** — Set vs List 선택, 메시지 검증 trade-off 등을 자기 논리로 답변.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **이전 라운드 가이드 미흡 반영** — Regex 캐싱, 에러 메시지에 입력값 포함, InputView가 Car 생성, runCatching 범위, hashCode/equals 도메인 정당화 등 1단계 코멘트가 거의 그대로 재등장.
18
+ - **`Const.kt`의 에러 메시지 prefix** — 의미 약한 상수.
19
+ - **`Car`의 data class 미활용**.
20
+ - **`AdvanceCount`의 require 메시지 통합 가능**.
21
+ - **테스트가 production 로직으로 데이터 빌드 + method source 남용**.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 이 라운드는 1단계 라운드의 리뷰가 거의 그대로 반복되는 양상. 리뷰어가 같은 가이드를 여러 번 짚는다는 것은 **학생이 핵심 학습을 흡수하지 못한 신호**.
26
+
27
+ 핵심 가이드:
28
+ 1. invariant 객체는 캐싱 (Regex)
29
+ 2. 에러 메시지 = 입력값 포함
30
+ 3. 도메인 객체 생성은 도메인 곁
31
+ 4. 테스트는 production 로직으로 데이터 빌드하지 않음 — 하드코딩
32
+ 5. SAM 인터페이스는 람다로
33
+
34
+ 학생의 **자기 정당화 능력은 높지만 리뷰 흡수는 낮은 패턴** — 본인 논리는 있지만 외부 가이드의 trade-off를 코드 변경으로 옮기는 부분이 약함.
35
+
36
+ - **대표 인용:**
37
+ > 여러 제안에 대해서 충분히 고민해보시고, 장단점과 특징을 잘 공부해서 본인의 것으로 잘 흡수했으면 좋겠어요.
38
+ >
39
+ > — @malibinYun on `src/main/kotlin/domain/GameCars.kt`
40
+
41
+ > 정확하게 어떤 메세지를 갖고있는 지 테스트를 한다면 메세지가 약간만 변경되더라도 거짓 양성이 발생하게 되어서 특정 문자열만 포함하도록 했습니다 ... 보통 개발자가 테스트 로직을 잘못 만드는 경우까지 고려해야 해서 테스트 코드를 작성해야 하나요?
42
+ >
43
+ > — @ki960213 (학생의 깊은 자기 정당화)
44
+
45
+ ## 얻은 교훈
46
+
47
+ - **자기 정당화 vs 리뷰 흡수의 balance.** 학생의 자기 논리는 학습에 중요하지만 외부 피드백을 코드로 옮기는 능력도 필요. 두 라운드에 걸쳐 같은 리뷰가 반복되면 자기 논리가 변경을 막고 있는지 점검.
48
+ - **반복되는 리뷰는 학생-리뷰어 모두에게 신호.** 같은 코멘트가 두 번 반복되면 (1) 학생이 흡수 못함, (2) 리뷰어 가이드가 학생 언어에 안 맞음, 둘 중 하나. 메타 토론 필요.
49
+ - **리뷰는 trade-off의 제시 + 학생의 선택.** "본인의 것으로 흡수"라는 리뷰어 메시지는 그 균형을 강조. 모든 가이드를 따를 필요는 없지만 trade-off는 인지해야.
50
+ - **테스트 메시지 검증의 trade-off** — `contains` (변경에 강함, 정확도 약함) vs `equals` (정확, 변경에 취약). 본인 결정의 이유가 학습.
51
+ - **사례 학습의 한계** — 학생이 "거짓 음성 vs 양성" 같은 깊은 논리 펼쳐도 실제 코드 변경에는 일관성 부족한 경우가 있음. 사고와 실천의 간극.