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,46 @@
1
+ # PR #73 — [스캇] step2 자동차 경주 미션 제출합니다
2
+
3
+ - **Reviewee:** [@chws0508](https://github.com/chws0508)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/73
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @galcyurio
7
+ - **라인 코멘트:** 5
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **도메인이 View에 의존하지 않도록 수정** — 1단계 피드백 잘 흡수.
12
+ - **TestOutputView 같은 테스트 더블 시도** — Controller 단위 테스트.
13
+ - **자기 의문의 깊이** — Result vs Exception, View 에러 처리 등.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`List<Car>`를 OutputView에 넘기고 OutputView가 Car 내부 꺼냄** — 도메인 약결합 잔존.
18
+ - **OutputView assert 패턴** — 고차 함수로 단순화 가능.
19
+
20
+ ## 리뷰어 의견 요지
21
+
22
+ 리뷰어 @galcyurio는 학생의 깊은 토론에 명확한 답:
23
+
24
+ 1. **"UI 아닌 도메인도 아닌 비즈니스 로직 = Controller"** — validation 후 재입력 같은 흐름이 Controller의 자연스러운 자리. View 변경에 영향 안 받고 단위 테스트 가능.
25
+
26
+ 2. **`Result.failure(Exception)`로 Exception 던지지 않고 표현 가능** — Exception 생성만 하고 던지지 않음. 또는 Either, 자체 Result.
27
+
28
+ 3. **테스트의 고차 함수 활용** — TestOutputView에 람다 넘기는 패턴.
29
+
30
+ 학생의 "이런 식으로 짠 이유" 회고에 대해 리뷰어가 "지금은 잘 수정됨"이라는 인정 메시지.
31
+
32
+ - **대표 인용:**
33
+ > UI의 역할은 아닌 것 같은데 그렇다고 domain 이라고 보기 힘든 것들에 대한 비즈니스 로직들은 Controller에 두시면 좋습니다. 지금처럼 validation을 해본 뒤에 실패했다면 다시 View에게 재입력을 받게 하기도 쉬운 layer이며 View와는 다르게 단위 테스트도 가능하기 때문입니다.
34
+ >
35
+ > — @galcyurio on `src/main/kotlin/view/InputView.kt:22`
36
+
37
+ > Result.Failure를 만들기 위해서는 Exception을 생성하기만 하고 던지지는 않으셔도 됩니다.
38
+ >
39
+ > — @galcyurio on `src/main/kotlin/controller/RacingGameController.kt:4`
40
+
41
+ ## 얻은 교훈
42
+
43
+ - **Controller = "UI도 아니고 도메인도 아닌 비즈니스 흐름의 자리".** validation + 재입력 같은 흐름 제어. 그 위치 자체가 책임 분배 답.
44
+ - **Exception 생성 ≠ 던지기.** `Result.failure(Exception(...))`로 Exception을 값으로 사용. 던지지 않으면 흐름은 정상.
45
+ - **고차 함수로 테스트 더블 단순화.** 람다를 생성자로 넘기면 페이크 객체의 표현이 즉시 가능.
46
+ - **이전 라운드의 흡수 정도가 깊다 = 다음 토론이 더 깊어진다.** 1단계의 도메인-View 분리 가이드를 잘 흡수해 2단계는 약결합 미세 조정 수준.
@@ -0,0 +1,55 @@
1
+ # PR #132 — [자동차 경주 구현] 오이 미션 제출합니다
2
+
3
+ - **Reviewee:** [@cucumber99](https://github.com/cucumber99)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/132
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 30
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **README 꼼꼼히 작성** — 리뷰어 명시적 칭찬.
12
+ - **`AttemptCount`로 시도 횟수를 도메인 객체화** — 원시 강박 해소 시도.
13
+ - **자기 결정의 회고적 응답** — 시도 횟수를 1번만 쓰니 변환을 늦춤 등 자기 추론 명시.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`StringBuilder` 사용 의도 모호** — 내부에서 `+` Concat. 의도와 도구가 어긋남.
18
+ - **`Car`의 position 표현이 백틱 `_position` + getCount 등 우회** — 코틀린 프로퍼티의 자연스러운 표현 활용 누락.
19
+ - **외부에서 Car의 값을 직접 꺼내 사용** — `Race`가 Car의 상태를 꺼내 사용. Tell-Don't-Ask 위반.
20
+ - **`lateinit var`로 Cars 선언** — 필요 없는 가변성. 다른 표현 가능.
21
+ - **예외 메시지에 입력값 미포함** — 사용자가 어떤 입력이 잘못됐는지 모름.
22
+ - **테스트의 공용 필드** — 격리 부족.
23
+ - **테스트 이름이 한글이 아니라 영어 + `@DisplayName`** — 가독성과 일관성 사이 trade-off, 학생의 결정은 가독성 우선이라 답함.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @malibinYun는 **도구의 의도 부합** 을 짚었다. `StringBuilder`는 가변 문자열 성능 최적화인데 그 안에서 `+`로 새 String 만들고 있으면 도구의 의도가 무의미.
28
+
29
+ 또한 **객체에 메시지 vs 값 꺼내기** 를 명확히: `cars.parsedCars`를 직접 꺼내 가공하지 말고 `cars.move(...)` 같은 메시지로.
30
+
31
+ 테스트의 자료원/도구 활용에 대해서도 가이드 — `runCatching`, `assertAll` 등 표준 도구의 활용도를 학습 자료로 제시.
32
+
33
+ `Car.INIT_POSITION + 1`처럼 테스트가 내부 상수에 의존하는 패턴에 대해서는 **"테스트 읽는 이가 그 내부 값을 알아야 하는가?"** 라는 캡슐화 본질 질문.
34
+
35
+ - **대표 인용:**
36
+ > StringBuilder를 사용하는데, 내부에서는 String을 + 로 Concat 하고 있네요! StringBuilder를 사용하는 이유를 모르고 있다는 반증이네요.
37
+ >
38
+ > — @malibinYun on `src/main/kotlin/controller/UserInterface.kt`
39
+
40
+ > 자동차들 객체의 값을 직접 꺼내 사용하기보다, 메시지를 던져보는 건 어떨까요?
41
+ >
42
+ > — @malibinYun on `src/main/kotlin/model/Race.kt`
43
+
44
+ > 테스트를 읽는 이가 이 내부 값에 대해 알아야하는 것이 부담이라고 생각해요. 내부의 값을 꼭 알아야할까요?
45
+ >
46
+ > — @malibinYun on `src/test/kotlin/model/CarTest.kt:52`
47
+
48
+ ## 얻은 교훈
49
+
50
+ - **도구의 의도와 사용이 일치해야 한다.** StringBuilder + String concat 같은 어긋남은 "도구를 모르고 쓴다"는 신호. 그 도구의 본질을 학습한 뒤 의식적으로 선택.
51
+ - **테스트 가독성 = 외부 컨텍스트 없이 이해 가능성.** 테스트가 `Car.INIT_POSITION + 1`처럼 production 상수를 참조하면, 읽는 이가 그 상수의 의미를 알아야. 캡슐화의 핵심은 "외부가 내부를 알 필요 없음".
52
+ - **표준 도구 학습이 코드 품질의 빠른 향상.** `runCatching`, `assertAll`, `assertSoftly` 같은 도구는 한 번 익히면 코드의 표현력이 크게 올라감.
53
+ - **메시지 vs 데이터 꺼내기는 매번 선택해야 하는 결정.** "메시지를 보내자"는 자동 결정이 아니라 매 호출 시 의식적 선택. 의식적인 메시지 호출 → 캡슐화 보존.
54
+ - **테스트 이름 = 명세.** `@DisplayName`은 메서드명을 줄이는 좋은 도구지만, "긴 한글 메서드명 vs DisplayName"의 선택은 팀 컨벤션과 학생의 가독성 기준이 다양.
55
+ - **예외 메시지에 입력값 포함의 가치.** 사용자가 "어떤 입력이 잘못됐는지" 빠르게 알 수 있어 UX와 디버깅이 동시에 개선.
@@ -0,0 +1,53 @@
1
+ # PR #177 — [자동차 경주 2단계] 오이 미션 제출합니다
2
+
3
+ - **Reviewee:** [@cucumber99](https://github.com/cucumber99)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/177
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 12
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **패키지를 `racingcar/domain/model`로 분리** — 도메인 분리 의식.
12
+ - **`Cars` 일급 컬렉션 도입** — 1단계의 외부 컨테이너에서 도메인 객체화.
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ - **`AttemptCount`가 문자열을 멤버로 가짐** — 도메인이 입력 형식에 결합. "시도 횟수" 자체는 Int여야 자연스러움.
17
+ - **`Cars`가 이름에 해당하는 문자열 리스트를 멤버로 가짐** — `Cars`라면 Car들의 컬렉션이어야지 이름 리스트는 별개.
18
+ - **도메인이 콘솔 뷰를 직접 그림** — `Cars.kt:38`이 표시 형식까지 만듦. 도메인과 뷰의 강한 결합.
19
+ - **`Cars.getWinner()`가 List를 반환** — 메서드명은 단일 Car를 기대하게 함. 시그니처가 거짓말.
20
+ - **테스트 메시지 검증 누락** — 1단계와 동일 패턴.
21
+ - **검증부 하드코딩 미반영** — 테스트가 production 상수 참조 패턴 잔존.
22
+ - **`stopCar`라는 테스트 픽스처의 의미 모호** — 전진 안 한 자동차를 그렇게 부르는 게 자연스러운지.
23
+ - **컨트롤러에 도메인 로직 잔재** — 분리가 완전하지 않음.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @malibinYun는 **도메인 객체가 입력 형식을 알면 안 된다** 는 본질을 1단계에 이어 다시 강조. `AttemptCount`가 String을 멤버로 가지는 어색함을 직접 짚음 — "시도 횟수 객체가 문자열을 가지고 있어야 하는 이유를 잘 모르겠네요".
28
+
29
+ 또한 `Cars`라는 일급 컬렉션의 정체성 — 이름 리스트가 아니라 Car들의 컬렉션이어야. 도메인 표현이 어디까지 들어가는지에 대한 명확한 가이드.
30
+
31
+ `getWinner(): List<Car>`의 시그니처와 이름 불일치도 짚음 — 단수 이름, 복수 반환은 호출자에게 거짓말.
32
+
33
+ - **대표 인용:**
34
+ > "시도횟수" 객체가 문자열을 가지고 있어야하는 이유를 잘 모르겠네요!
35
+ >
36
+ > — @malibinYun on `src/main/kotlin/racingcar/domain/model/AttemptCount.kt`
37
+
38
+ > 도메인이 콘솔 뷰에 대한 뷰를 직접 그리고 있네요. 도메인과 뷰의 매우 강한 결합이에요. 서로 분리해보는 건 어떨까요?
39
+ >
40
+ > — @malibinYun on `src/main/kotlin/racingcar/domain/model/Cars.kt:38`
41
+
42
+ > 메서드 명만 보면, cars 객체에서 getWinner를 하는 것이니 당연히 Car 객체를 반환할 것 처럼 느껴지네요. 메서드 스펙을 더 구체적으로 표현해보는 건 어떨까요?
43
+ >
44
+ > — @malibinYun on `src/main/kotlin/racingcar/domain/model/Cars.kt:22`
45
+
46
+ ## 얻은 교훈
47
+
48
+ - **도메인 객체의 멤버는 도메인 의미여야 한다.** "시도 횟수"가 String? 도메인 의미로는 Int가 자연스러움. 입력에서 String을 받았더라도 도메인 진입 전에 Int로 변환.
49
+ - **일급 컬렉션은 그 컬렉션의 정체성을 가진 객체.** `Cars`는 `List<Car>`의 도메인적 표현. `List<String>` 같은 다른 데이터를 같이 가지면 그 정체성이 흐려진다.
50
+ - **단수 이름, 복수 반환은 약속 위반.** `getWinner` → 단수 Car를 기대. `getWinners` 또는 `findWinners`처럼 시그니처가 도메인 의도를 정확히 전달.
51
+ - **연속된 라운드에서 같은 코멘트가 반복되면 학습 누락의 신호.** 1단계와 2단계에서 같은 종류(메시지 검증, 도메인-뷰 결합, 입력값 메시지)가 반복되면 핵심 학습이 일어나지 않은 것. 학생도 리뷰어도 이 신호를 의식해야.
52
+ - **객체 분리의 두 단계** — (1) 도메인 로직을 컨트롤러에서 도메인 객체로, (2) 그 도메인 객체의 책임을 더 세분화. 1단계만 끝났다고 2단계가 자동으로 따라오지 않음.
53
+ - **자기 의문 응답이 학습 사이클의 척도** — "뷰에서 받은 입력값을 직접 변환하는 부분이 강하게 의존적이라는 뜻인가요?"라는 학생의 재질문은 학습 의지 신호. 리뷰어가 더 명확한 가이드를 줄 기회.
@@ -0,0 +1,57 @@
1
+ # PR #146 — [자동차 경주 구현] 이든 미션 제출합니다
2
+
3
+ - **Reviewee:** [@devfeijoa](https://github.com/devfeijoa)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/146
5
+ - **단계:** 1단계 (단일 PR)
6
+ - **리뷰어:** @krrong
7
+ - **라인 코멘트:** 45
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **InputView/OutputView 분리** — 리뷰어가 명시적으로 칭찬 💯.
12
+ - **`Car`의 책임을 자기 언어로 재정의 후 수정** — "Car의 관심사는 출력이 아니라 위치/이동 여부 관리"로 정리, position 필드 도입.
13
+ - **리뷰의 의도를 자기 사고로 풀어 답변** — 검증, 책임의 자리 등에 대해 길게 답하며 토론을 끌어옴.
14
+ - **테스트 격리 학습** — 단일 인스턴스 공유의 문제를 깨닫고 `@BeforeEach`로 격리.
15
+ - **`Race`의 isMove를 Car로 옮김** — 책임의 자리를 자기 판단으로 재배치.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ - **`utils/Constants.kt`로 상수 한 곳에 모음** — 결론적으로 "재사용은 Constants, 단일 사용은 companion"이라는 자기 기준을 만들었지만, 리뷰어는 한 발 더 나가 "Constants 자체가 결합도의 핵심"이라고 짚음.
20
+ - **`ErrorHandler.kt`라는 -er 명사** — 처리만 하는 절차 클래스. 검증의 주인이 도메인이 아님.
21
+ - **`Race.rawCarNames`처럼 입력 형식 단어가 도메인에 침투** — `Motorcycle`이 되면 `rawMotorcycleNames`로 또 바뀜.
22
+ - **`RaceController.start` / `playing` 함수명이 반환값 의도 안 드러냄** — 동사인지 명사인지, 무엇을 돌려주는지 시그니처가 약함.
23
+ - **`Car`에서 `moveOrStop`이 String을 들고 있음** — 출력용 표현을 도메인이 알게 됨.
24
+ - **`GenerateRandomNumber`라는 동사형 클래스 + 자기 검증 반복** — Kotlin 라이브러리를 못 믿는 모양새의 테스트.
25
+ - **이중 리스트(`List<List<X>>`) 출력 구조** — Car 수정 전엔 OutputView가 거부감 있는 시그니처 처리.
26
+ - **입력 공백 처리 누락** — ` 이든`처럼 앞뒤 공백 그대로. 도메인 무결성 정의가 좁음.
27
+ - **테스트가 production 상수에 결합 + 랜덤 테스트** — `0~9 검증`은 사실상 라이브러리 검증.
28
+
29
+ ## 리뷰어 의견 요지
30
+
31
+ 리뷰어 @krrong는 **"이 책임의 진짜 주인"** 을 많이 물었다. Car의 출력 책임, Race의 이동 결정 책임, ErrorHandler의 검증 책임 등 — 책임이 어느 객체에 있어야 하는지 학생이 스스로 도달하게 만드는 패턴.
32
+
33
+ 또한 **"라이브러리를 신뢰하라"** 는 명확한 가이드: Random 라이브러리가 0-9 범위 반환하는지 검증하는 테스트는 사실상 의미 없음. 외부 신뢰 가능한 도구까지 검증하면 코드가 무한 검증 루프.
34
+
35
+ 이름의 입력 형식 침투(`rawCarNames`)에 대해 `Motorcycle` 가정 질문으로 추상화 부족을 즉시 드러내는 화법도 인상적.
36
+
37
+ - **대표 인용:**
38
+ > Race의 관점에서 바라봤을 때 넘어오는 값이 rawCarNames인지 rawTryCount인지 알 필요가 있을까요? 만약 `Motorcycle` 클래스의 이름이 넘어오면 `rawMotorcycleNames`로 바뀌어야 할까요?
39
+ >
40
+ > — @krrong on `src/main/kotlin/racingcar/domain/Race.kt`
41
+
42
+ > 생성된 난수가 0~9 사이의 값인가를 검증한다는 말은 코틀린 라이브러리를 믿지 못한다는 말이고, 이는 곧 코틀린에서 제공하는 모든 기능을 사용할 때마다 검증을 해야 하는 것처럼 보여요.
43
+ >
44
+ > — @krrong on `src/main/kotlin/racingcar/domain/GenerateRandomNumber.kt`
45
+
46
+ > Car 클래스의 관심사는 출력일까요? ... String 값을 가지고 있기보다 위치를 나타내는 Position을 가지고 있는 것이 좋지 않을까요?
47
+ >
48
+ > — @krrong on `src/main/kotlin/racingcar/domain/Car.kt`
49
+
50
+ ## 얻은 교훈
51
+
52
+ - **도메인이 입력 형식 단어를 알면 안 된다.** `raw`-, `Input`-, `Encoded`- 같은 접두사는 입력 경계 어휘. 도메인이 그 단어를 알면, 형식이 바뀌면 도메인이 바뀐다.
53
+ - **신뢰의 경계를 정한다.** 외부 라이브러리(코틀린의 Random, 표준 컬렉션 등)의 행동을 검증하면 검증의 연쇄가 끝없다. 우리는 그 라이브러리를 신뢰하고, 우리 코드가 그 라이브러리를 어떻게 *사용*하는지를 검증.
54
+ - **함수 이름이 반환의 종류를 암시한다.** `start`, `playing`처럼 동작 동사가 값을 반환한다면 호출자가 혼란. `getCars`, `prepareCars`처럼 반환 의도가 보이는 이름이 안전.
55
+ - **도메인 객체가 표현 책임을 갖지 않는다.** Car가 출력용 String을 들고 있는 것은 View 누수. 위치는 `position: Int`로, 표현은 View가 만든다.
56
+ - **테스트 격리는 객체 격리의 거울.** `@BeforeEach`나 새 인스턴스 생성으로 각 테스트가 독립이어야, 한 테스트의 상태가 다른 테스트의 진실을 흔들지 않는다.
57
+ - **자기 결정의 회고 가치.** "왜 Constants에 모았는가" → "재사용 vs 단일 사용으로 분기"라는 결론까지 도달한 학생의 사고 과정은 리뷰어가 짚어주는 다음 단계("companion에 왜 두는가?")로 자연스럽게 이어진다.
@@ -0,0 +1,55 @@
1
+ # PR #149 — [자동차 경주 구현] 디랙 미션 제출합니다
2
+
3
+ - **Reviewee:** [@doabletuple](https://github.com/doabletuple)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/149
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @hyemdooly
7
+ - **라인 코멘트:** 22
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **중복 검증을 Set으로 단순화** — 리뷰어 칭찬.
12
+ - **`@ParameterizedTest` 활용**.
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ - **`util.Constants`로 상수 집중** — 결합도 안티패턴.
17
+ - **Controller가 차의 위치를 직접 바꿈** — 외부 조종.
18
+ - **반환 타입 `MutableList` 광범위 사용** — 한 번 만든 후 변경 없는 자동차 리스트도 mutable.
19
+ - **`maxOf`를 for문 안에서 매번 계산** — 한 번만 계산해야 효율적.
20
+ - **`Car.position`이 public** — 외부 변경 가능.
21
+ - **`Validator`의 오류 메시지 모호** — "유효하지 않은 자동차 이름"이 무엇이 무효인지 안 드러남.
22
+ - **Int 변환 로직 중복** — 한 번에 변환 후 사용.
23
+ - **`BufferedReader` 사용** — readln()으로 충분.
24
+ - **`CarTest`가 Controller 동작도 테스트** — 책임 어긋남.
25
+ - **`OutputView`가 출력 메시지 자체를 InputView가 출력** — 출력 책임이 흩어짐.
26
+
27
+ ## 리뷰어 의견 요지
28
+
29
+ 이 PR은 1단계의 전형적 패턴이 광범위하게 나타남 — Constants, Mutable 남용, 외부 조종, 비대 Controller 등. 리뷰어 @hyemdooly는 한 PR에서 종합적으로 짚어줌.
30
+
31
+ 주요 가이드:
32
+ 1. **"차가 직접 움직이게 할 수는 없을까요?"** — Tell-Don't-Ask
33
+ 2. **"`Constants` object가 무궁무진하게 커지지 않을까요?"** — 상수 분산의 안티패턴
34
+ 3. **테스트 책임 = production 클래스 책임의 거울**
35
+
36
+ - **대표 인용:**
37
+ > Controller에서 차의 위치를 바꾸기 보단, 차가 직접 움직일 수 있지 않을까요?
38
+ >
39
+ > — @hyemdooly on `src/main/kotlin/RacingController.kt`
40
+
41
+ > 만약 기능이 커져서, 더 많은 상수를 정의해야한다면? 1000개의 상수를 정의해야한다면? 이 `Constants` object가 무궁무진하게 커지지 않을까요?
42
+ >
43
+ > — @hyemdooly on `src/main/kotlin/util/Constants.kt`
44
+
45
+ > 이 테스트는 `Car`에 대한 테스트일까요, `Controller`에 대한 테스트일까요?
46
+ >
47
+ > — @hyemdooly on `src/test/kotlin/CarTest.kt`
48
+
49
+ ## 얻은 교훈
50
+
51
+ - **MutableList의 사용은 정말로 변경되어야 할 때만.** 한 번 만든 자동차 리스트가 변경될 일 없으면 List. 반환 타입의 가변성 = 호출자에게 주는 약속.
52
+ - **`maxOf`/`maxBy` 같은 reduce 연산은 반복문 안에 들어가면 비용이 폭발.** 한 번 계산 후 변수로.
53
+ - **에러 메시지 = UX.** "유효하지 않은 X"는 무엇이 무효인지 안 알려줌. "X는 5자 이하" 같은 구체적 메시지가 사용자 경험.
54
+ - **테스트 클래스명 = 테스트 대상의 책임 정의.** `CarTest`가 Controller 동작을 테스트한다면 두 클래스의 책임이 흐려진 신호.
55
+ - **1단계의 전형적 안티패턴 목록:** (1) Constants 단일 파일, (2) MutableList 남용, (3) Controller가 도메인 조종, (4) 자동차 외부 조종, (5) BufferedReader 같은 자바 잔재, (6) 모호한 에러 메시지. 이 6가지가 거의 모든 1단계 PR에 반복.
@@ -0,0 +1,53 @@
1
+ # PR #175 — [자동차 경주 2단계] 디랙 미션 제출합니다
2
+
3
+ - **Reviewee:** [@doabletuple](https://github.com/doabletuple)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/175
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @hyemdooly
7
+ - **라인 코멘트:** 13
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Car.position`을 부생성자로 받아 테스트 가능성 확보** — 결정적 시나리오 빌드.
12
+ - **자기 의문에 대한 깊은 회고** — data class 사용 이유, equals/hashCode 동작, 객체 동등성 등을 디컴파일까지 해서 확인.
13
+ - **공식문서 직접 인용** — 학습 사이클 깊음.
14
+ - **`Car`의 data class → class 전환** — "데이터 보유"가 아닌 "이름 검증 + 전진" 역할이므로 class가 적절.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`GameController`를 object로 변경** — 학생 본인이 명확한 이유 없이 "인스턴스 하나면 충분" 정도로 결정. object 선택의 정당화가 약함.
19
+ - **`Car`에 출력 String 반환 함수 잔존** — View 책임이 도메인에.
20
+ - **`Game.cars`를 그대로 반환** — MutableList 그대로 노출. 방어적 복사 누락.
21
+ - **`InputView`가 `OutputView`에 의존** — 책임 결합. Controller가 둘을 조립해야.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 리뷰어 @hyemdooly는 **"data class 사용 이유의 본질 점검"** 을 짚었다. 공식 문서 직접 인용: "data class는 데이터 보유가 주 목적". Car가 데이터만 가지는가? 검증/이동까지 한다면 데이터 클래스가 아닐 가능성.
26
+
27
+ 또한 **디컴파일 권장** — 학생이 추측("이름 같고 위치 다르면 중복 걸러내지 못한다")으로 결론 내리는 대신 디컴파일 결과로 확인하라는 가이드. 결과적으로 학생의 추측이 틀렸음을 본인이 확인 (data class는 주생성자 프로퍼티로만 equals 자동 생성).
28
+
29
+ **방어적 복사** — MutableList 반환의 위험을 다시 한 번 짚음.
30
+
31
+ 학생의 깊은 자기 회고에 대해 직접 답변 없이 학습 자료(공식문서, 디컴파일)로 안내하는 리뷰 스타일이 인상적.
32
+
33
+ - **대표 인용:**
34
+ > 공식문서에서 데이터 클래스는 데이터를 주로 보유하는데 사용한다고 이야기해요. 지금 자동차는 순수하게 데이터를 갖고 있는 역할일까요?
35
+ >
36
+ > — @hyemdooly on `src/main/kotlin/domain/Car.kt`
37
+
38
+ > 정말 그런지 한번 디컴파일해서 확인해보세요!
39
+ >
40
+ > — @hyemdooly on `src/main/kotlin/domain/Car.kt`
41
+
42
+ > MutableList를 그대로 반환하면 어떤 일이 일어날 수 있을까요? 방어적 복사에 대해 학습해보세요.
43
+ >
44
+ > — @hyemdooly on `src/main/kotlin/domain/Game.kt:12`
45
+
46
+ ## 얻은 교훈
47
+
48
+ - **data class 사용의 정당화 = 데이터 보유.** 행위가 있으면 일반 class. 코틀린 공식문서의 기준을 직접 확인하는 것이 가장 안전.
49
+ - **추측 대신 확인.** 학생이 "이렇게 동작할 것 같다"는 추측을 디컴파일 결과로 확인 → 자기 모델 보정. 리뷰어가 답을 주지 않고 도구를 안내한 가치.
50
+ - **방어적 복사의 자리.** 컬렉션을 반환할 때마다 외부 변경 가능성을 차단. `cars.toList()` 또는 `cars.toImmutableList()` 같은 보호.
51
+ - **object 선택의 정당화는 도메인 의미 + 라이프사이클** — "인스턴스 하나로 충분"은 충분하지 않은 정당화. "프로그램 전체에서 단 하나만 존재해야 한다"는 도메인적 의미가 있어야 object.
52
+ - **자기 학습 사이클이 가장 깊은 학습.** 학생이 공식문서 → 디컴파일 → 자기 모델 수정의 과정을 거치면 그 지식이 진짜 본인 것이 된다. 리뷰어는 가이드만 제공.
53
+ - **View → View 의존은 금지.** InputView가 OutputView를 알면 입출력의 책임 경계가 무너진다. 조립은 Controller의 일.
@@ -0,0 +1,58 @@
1
+ # PR #154 — [자동차 경주] 동현 미션 제출합니다
2
+
3
+ - **Reviewee:** [@donghyun81](https://github.com/donghyun81)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/154
5
+ - **단계:** 2단계 (단일 PR)
6
+ - **리뷰어:** @KwonDae
7
+ - **라인 코멘트:** 20
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **InputView/OutputView 분리**.
12
+ - **`require()` 활용한 도메인 무결성**.
13
+ - **`CarFactory`로 객체 생성 로직 분리** — 익명 이름 부여 같은 UX 친화 기능 시도.
14
+ - **PR 본문에 명확한 질문 4개** — 상수화 범위, 함수형 immutable, 검증 위치 등.
15
+ - **사용자 친화 사고** — "매번 이름 입력이 번거롭다 → 자동 부여" 같은 UX 관점.
16
+
17
+ ## 못한 점 (설계 관점)
18
+
19
+ - **InputView가 검증을 안 함** — "View에서 검증하면 View 의미가 퇴색"이라는 잘못된 일반화. 학생이 후속 토론으로 정리.
20
+ - **`RandomGenerator`가 `Random`에 직접 의존** — Car 테스트 시 결정적 결과 못 만듦. 전략패턴 권장.
21
+ - **`Const.kt` 한 파일에 모든 상수** — 응집도 낮음. 1000개 상수 시 무너짐.
22
+ - **`CarFactory`의 익명 이름 부여 = 함수 두 가지 일** — 같은 함수가 "입력 받은 이름 적용" + "빈 입력 시 기본 이름 부여" 둘 다. 호출 측에서 어느 경로인지 안 보임.
23
+ - **테스트 함수명이 요구사항 표현과 어긋남** — "5자 초과할 수 없다" vs "5자 초과 시 에러" 등.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @KwonDae의 핵심 메시지:
28
+
29
+ 1. **"한 함수에 두 가지 기능"의 위험** — `CarFactory`가 입력 이름 적용 + 빈 입력 기본값 부여 둘 다. → "동료 개발자가 이 함수가 두 가지 기능을 모두 할 것이라 예상하기 쉬울까요?" 대안: Controller에서 `inputView.getNames() ?: defaultNames()`로 명시적 분기.
30
+
31
+ 2. **View의 자체 검증 책임** — "InputView가 입력값을 *스스로* 검증할 수 있도록 역할을 부여" → 학생은 처음에 "View에서 검증하면 View 의미 퇴색"으로 거부했지만 후속 토론에서 수용.
32
+
33
+ 3. **상수 위치 토론** — 정답 없음을 시인. "공통 상수가 아니면 범위 지정자를 두는 편" → 사용 범위에 맞는 자리.
34
+
35
+ 4. **전략 패턴으로 `RandomGenerator` 대체** — Car 테스트가 Random에 묶여 결정적 검증 불가.
36
+
37
+ 5. **상수화 범위** — `joinTo(",")`의 쉼표까지 상수화할지의 정답 없음. "프로젝트마다 컨벤션, 페어의 의견에 따라".
38
+
39
+ - **대표 인용:**
40
+ > 사용자가 이름을 입력하든 하지 않든 위 함수를 거쳐가게 되어있는데, 과연 동료 개발자가 이 함수가 두가지 기능을 모두 할 것이라 예상하기 쉬울까요? `val inputNames = inputView.getNames() ?: defaultNames()` 이런식으로 가독성을 고려해보면 어떨까요?
41
+ >
42
+ > — @KwonDae on `src/main/kotlin/CarFactory.kt:13`
43
+
44
+ > InputView와 OutputView를 잘 분리해주셨네요. 그렇다면 InputView에서도 입력값에 대해 스스로 검증할 수 있도록 역할을 부여해보는건 어떨까요?
45
+ >
46
+ > — @KwonDae on `src/main/kotlin/InputView.kt:3`
47
+
48
+ > 만약 프로젝트에서 사용하는 상수가 1000개 이상이 된다면 어떤 일이 발생할까요?
49
+ >
50
+ > — @KwonDae on `src/main/kotlin/Const.kt`
51
+
52
+ ## 얻은 교훈
53
+
54
+ - **"두 가지 일을 하는 함수"는 호출 측에서 보이지 않는다.** 빈 입력 시 기본값을 함수 안에서 처리하면 호출자는 "이름 받기"만 본다. 대안: 호출 측에서 `?: defaultNames()`로 분기를 노출.
55
+ - **View의 검증 = "이건 View의 의미를 퇴색시킨다"가 아니라 "View가 받은 입력의 형식을 보호한다"**. UI 형식 검증과 도메인 규칙 검증은 다른 층이고, View가 형식 검증을 가지는 게 자연스럽다.
56
+ - **상수 1000개 압박 시뮬레이션이 강력하다.** "지금은 잘 작동"이라도 도메인이 성장하면 단일 파일이 깨지는지를 미리 점검.
57
+ - **`Random`에 직접 의존 = 테스트 불가능.** 인터페이스 + 결정적 fake 주입이 단위 테스트의 시작.
58
+ - **사용자 친화 사고는 좋지만, *그 친화가 코드에 어떻게 드러나는지*가 더 중요.** 빈 입력 시 자동 이름 부여를 *명시적으로* 보여주는 코드가 동료 개발자에게 친화적.
@@ -0,0 +1,48 @@
1
+ # PR #103 — [자동차 경주] 찬용 미션 제출합니다
2
+
3
+ - **Reviewee:** [@dpcks0509](https://github.com/dpcks0509)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/103
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @vagabond95
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Exception에 케이스별 상세 메시지**.
12
+ - **Validator 검증 로직 분리** + 메시지 상수화.
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ - **`Exception`이라는 클래스명** — 실제 Exception 타입과 혼동.
17
+ - **`","` 같은 매직 문자열**.
18
+ - **`Validator` 모호한 이름** → `InputValidator` 권고.
19
+ - **`올바르지 않은 레이싱 게임` 테스트명이 너무 포괄적**.
20
+ - **테스트가 랜덤 의존 (값을 임의로 넣어 회피)**.
21
+ - **Car가 랜덤 생성 책임 보유** — 도메인이 외부 비결정성에 의존.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 리뷰어 @vagabond95의 메시지:
26
+
27
+ 1. **클래스명 = 책임. `Exception` 접미사 ≠ 실제 Exception**. 실제 자바 Exception과 혼동 위험.
28
+
29
+ 2. **모호한 이름 = 모호한 책임의 신호** — `Validator` → `InputValidator`. "정의할 수 있는 범위가 넓을 수 있도록 짓는 것을 지양."
30
+
31
+ 3. **테스트 이름 = 한 시나리오 한 의미**. "올바르지 않은 레이싱 게임"은 너무 포괄적.
32
+
33
+ 4. **Car ↔ 랜덤 연관 없음**. "클래스에는 꼭 해당 클래스에서만 수행하는 것이 적절한 함수만 남겨라."
34
+
35
+ - **대표 인용:**
36
+ > input 값에 대한 검증이므로 InputValidator 가 좀 더 적절하지 않을까요~? 클래스/함수 네이밍을 지으실 때, 너무 모호하거나 정의할 수 있는 범위가 넓을 수 있도록 짓는 것을 지양해주시면 좋습니다. 네이밍이 모호하다는 것은 곧 해당 클래스/함수의 역할이 모호하거나 모호해질 수 있다는 신호이기 때문입니다
37
+ >
38
+ > — @vagabond95 on `src/main/kotlin/racingcar/Validator.kt`
39
+
40
+ > 자동차라는 도메인을 떠올렸을 때, 랜덤 한 숫자를 생성하는 것과 자동차간에 연관관계는 크지 않을 것 같아요. 클래스에는 꼭 해당 클래스에서만 수행하는 것이 적절한 함수만 남겨보면 어떨까요?
41
+ >
42
+ > — @vagabond95 on `src/main/kotlin/racingcar/model/Car.kt`
43
+
44
+ ## 얻은 교훈
45
+
46
+ - **클래스명에 *타입 시그널*을 잘못 넣지 말 것**. `Exception` 접미사는 *Exception 타입* 의미. 검증 객체엔 `Validator`/`Validation`.
47
+ - **클래스의 함수 = "그 클래스의 책임에 속하는가" 검증**. Car에 랜덤 생성 함수가 있다면 Car의 책임이 *움직임*+*랜덤*으로 흐림. 분리.
48
+ - **테스트 이름의 *정밀도***. "올바르지 않은 게임"은 5가지 실패 케이스 모두 포섭 → 어떤 실패인지 모름. 케이스별 분리.
@@ -0,0 +1,48 @@
1
+ # PR #112 — [자동차 경주 - 리팩토링] 찬용 미션 제출합니다
2
+
3
+ - **Reviewee:** [@dpcks0509](https://github.com/dpcks0509)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/112
5
+ - **단계:** 2단계 (리팩토링)
6
+ - **리뷰어:** @vagabond95
7
+ - **라인 코멘트:** 9
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Controller 코드 간결화**, `private set`.
12
+ - **MovingStrategy 인터페이스 도입** (전략 패턴).
13
+ - **수동 move로 결정적 테스트 시도**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`end()` 함수 — `judgeWinners`까지 포함하면 `progressRacingGame`인지 `end`인지 모호**.
18
+ - **Controller가 winners 만들고 view로 넘김** — RacingGame이 winners 직접 만들어 넘기는 게 더 깔끔.
19
+ - **인터페이스 구현체가 RacingGame 단 하나** — 추상화 이점 미실현.
20
+ - **테스트가 Car 직접 제어** — RacingGame 검증 아닌 Car 재검증.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 리뷰어 @vagabond95의 핵심 가르침:
25
+
26
+ 1. **함수 이름의 *경계 모호함*** — `end`가 judgeWinners를 포함한다고 볼 수도, progressRacingGame이라고 볼 수도. 한 함수에 2가지 이상 동작이 묶이면 이름 결정 불가.
27
+
28
+ 2. **테스트의 진짜 목적 = "이 객체가 자기 책임을 다하는가"** — Car를 수동 제어해서 winner가 나오면 그건 CarTest 반복. RacingGame을 직접 제어해서 결과 검증해야 RacingGame 테스트.
29
+
30
+ 3. **전략 패턴으로 "랜덤을 결정적으로"** — 움직임 방식이 바꿀 수 있다면 테스트도 가능. 구현체 하나로는 추상화 이점 미실현.
31
+
32
+ 4. **Controller의 책임 = view-domain 연결**. winners 계산 같은 비즈니스 로직은 domain.
33
+
34
+ - **대표 인용:**
35
+ > 그런데, 이 코드는 car 를 직접 제어했기 때문에, racingGame 이 정말로 그렇게 동작하는지는 검증할 수 없어요. CarTest 를 다시 반복한 것에 가까워요. 결국 racingGame 을 검증하려면 racingGame 을 직접 제어하고, 이로부터 나온 결과를 활용하여 테스트를 돌려야합니다.
36
+ >
37
+ > — @vagabond95 on `src/test/kotlin/racingcar/RacingGameTest.kt`
38
+
39
+ > 위에서 작성해주신 것을 조금 더 유연하게 코드로 풀어보는 방법이 있을 것 같아요. 전략 패턴 이라는 키워드가 도움이 되실 것 같습니다
40
+ >
41
+ > — @vagabond95 on `src/test/kotlin/racingcar/RacingGameTest.kt`
42
+
43
+ ## 얻은 교훈
44
+
45
+ - **함수 이름 결정 곤란 = SRP 위반의 진단 도구**. "end가 맞나, progress가 맞나" 고민이 들면 두 동작을 분리.
46
+ - **테스트가 자기 객체를 검증하는지 확인**. Car를 수동 제어한 RacingGameTest = CarTest 재현. RacingGame을 직접 제어해서 검증.
47
+ - **전략 패턴 = 결정적 테스트의 출발점**. "랜덤하게 움직인다"가 본질이 아니라 "움직이는 방식이 *바뀔 수 있다*"가 본질. 인터페이스로 표현하면 테스트도 결정적.
48
+ - **추상화의 이점 = 다른 구현체가 있을 때 발현**. 구현체 하나라면 인터페이스 = 죽은 추상. 적어도 테스트용 fake 구현체 1개 + 프로덕션 구현체 1개로 둘 충족.
@@ -0,0 +1,60 @@
1
+ # PR #82 — [자동차 경주] 술향 미션 제출합니다
2
+
3
+ - **Reviewee:** [@drunkenhw](https://github.com/drunkenhw)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/82
5
+ - **단계:** 2단계 (단일 PR)
6
+ - **리뷰어:** @sujin9
7
+ - **라인 코멘트:** 18
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Position 별도 value class 후보로 분리**.
12
+ - **`runCatching` 시도** — 코틀린 idiom 학습 시도.
13
+ - **`require` 활용**, `repeat` + `joinToString` 등 컬렉션 함수 활용.
14
+ - **String template 활용** (출력).
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **Controller가 기능별로 안 나뉨** — 한 메서드에 여러 책임.
19
+ - **`Car.position`이 var (외부 변경 가능)**.
20
+ - **`InputView`에서 try-catch (runCatching) 안에 입력 형식 검증** — `toIntOrNull` 단순화 가능.
21
+ - **테스트 함수명과 assertion 불일치** — "true를 반환한다"인데 `isFalse()` assert.
22
+ - **테스트 함수명에 라운드 수 같은 구체 조건 누락**.
23
+ - **Position이 data class** — value class가 더 적합 (대수적 동치성 + 인라인).
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @sujin9의 핵심 가르침:
28
+
29
+ 1. **`runCatching`의 *진짜 가치* = Result extension들의 풍부함**:
30
+ - `onSuccess / onFailure / getOrThrow / getOrElse / getOrDefault / fold / map / recover`
31
+ - try-catch + when 분기를 더 짧고 명확하게.
32
+
33
+ 2. **`toIntOrNull() ?: ...` 패턴이 더 단순** — Result wrapper 없이 같은 효과. 입력 형식 검증 정도라면 충분.
34
+
35
+ 3. **코틀린 예외 처리 원칙** — "논리 오류 제외하고 정상 흐름 안에서는 exception을 던지지 않는다." (Elizarov 글, 안드로이드 레벨1 요구사항).
36
+
37
+ 4. **`data class` vs `value class`** — Position 같은 단일 값 wrapper는 value class (Kotlin 1.5+, 인라인). data class는 다중 필드 동치성.
38
+
39
+ 5. **테스트 함수명 = 라운드 수 등 구체 조건**.
40
+
41
+ - **대표 인용:**
42
+ > 코틀린에서 예외 처리를 할 때는 논리 오류를 제외한 정상적인 흐름 안에서는 exception을 던지지 않는 것을 지향하고 있어요.
43
+ >
44
+ > — @sujin9 on `src/main/kotlin/racingcar/view/InputView.kt`
45
+
46
+ > 다음과 같이 써도 무방할 것 같습니다! :) 혹은, 더 간단하게 표현하고 싶다면 `return readln().toIntOrNull() ?: sendRound()` 이러한 방법도 있습니다
47
+ >
48
+ > — @sujin9 on `src/main/kotlin/racingcar/view/InputView.kt`
49
+
50
+ > 여기서는 value class 를 사용해보셔도 좋을 것 같아요! data class와 value class의 차이는 무엇일까요?
51
+ >
52
+ > — @sujin9 on `src/main/kotlin/racingcar/domain/Position.kt:3`
53
+
54
+ ## 얻은 교훈
55
+
56
+ - **단일 값 wrapper = value class (Kotlin inline)**. Position(value: Int) 같이 1개 필드 + 동치성만 필요하면 data class보다 value class — 런타임 오버헤드 없이 타입 안전성.
57
+ - **`runCatching` extensions가 try-catch보다 강력** — `onFailure { }.getOrElse { }` 같은 체이닝으로 명령형 try-catch가 선언형으로.
58
+ - **입력 형식 검증은 `toIntOrNull() ?:`로 충분**. Result wrapper는 *복잡한 에러 분기*가 필요할 때만.
59
+ - **코틀린의 예외 철학** — 정상 흐름에선 예외 안 던지기. 사용자 재입력 = 정상 흐름. `null` 또는 재귀로.
60
+ - **테스트 함수명과 assertion 일치**. "true를 반환한다"인데 `isFalse()` = 테스트가 *틀린 사실*을 검증. 리뷰에서 잡힐 신호.
@@ -0,0 +1,59 @@
1
+ # PR #145 — [자동차 경주] 동희 미션 제출합니다
2
+
3
+ - **Reviewee:** [@etama123](https://github.com/etama123)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/145
5
+ - **단계:** 2단계 (단일 PR)
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 19
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Validator/도메인 분리, RandomGenerator 추상화**.
12
+ - **피드백을 즉시 흡수** — STANDARD_NUMBER → MOVEMENT_THRESHOLD 같은 이름 개선.
13
+ - **자기 답변에 *이유* 명시** — "var 외부 노출 시 원치 않는 변경 가능 → private set."
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **Controller가 *필드*로 input 보관** — `run` 메서드 안에서만 쓰이는데 클래스 필드.
18
+ - **`Car.position`이 var (외부 변경 가능)**.
19
+ - **`STANDARD_NUMBER`라는 일반 어휘** — 자동차 경주 모르는 사람이 의미 모름.
20
+ - **에러 메시지에 입력값 안 담김** — "잘못된 입력입니다" vs "잘못된 입력 'foo'입니다".
21
+ - **테스트가 단일 케이스 + ParameterizedTest** — 케이스 1개면 ParameterizedTest 무의미.
22
+ - **테스트 함수명이 추상적** — "개별 자동차 이름 유효성 검사".
23
+
24
+ ## 리뷰어 의견 요지
25
+
26
+ 리뷰어 @malibinYun의 핵심 가르침:
27
+
28
+ 1. **에러 메시지에 *입력값*을 담아라** — 디버깅의 시작점. "잘못된 입력입니다"는 무엇이 잘못인지 모름.
29
+
30
+ 2. **상수 이름 = 도메인 무지인이 봐도 의미가 보이는가** — `STANDARD_NUMBER`는 "이게 뭐의 표준?" 모름. `MOVEMENT_THRESHOLD` (이동 임계값).
31
+
32
+ 3. **테스트 setup의 재사용 vs 재생성** — Car 객체를 매 테스트 블록에서 새로 생성. 공유 state로 인한 테스트 간 간섭 제거.
33
+
34
+ 4. **경계값만 테스트** — "4미만과 4이상"이면 3과 4 두 케이스만으로 충분.
35
+
36
+ 5. **`isTrue()` vs `isEqualTo()`** — 가독성 측면. 테스트 읽는 사람이 "머릿속에서 연산하지 않게."
37
+
38
+ 6. **테스트 함수명 = 구체적인 조건이 보여야** — "개별 자동차 이름 유효성 검사"는 어떤 조건인지 모름.
39
+
40
+ - **대표 인용:**
41
+ > 전반적으로 어떤 값이 들어왔길래 Exception이 발생하는지 메시지에 담아주는 건 어떨까요? 입력 값을 예외 메시지에 담으면 어떤 장점이 생길 수 있을까요?
42
+ >
43
+ > — @malibinYun on `src/main/kotlin/validator/InputValidator.kt`
44
+
45
+ > STANDARD_NUMBER는 자동차 경주 게임에 대한 지식이 없는 사람이 보았을 때도 한 번에 알아볼 수 있는 의미를 담은 이름일까요?
46
+ >
47
+ > — @malibinYun on `src/main/kotlin/domain/Car.kt`
48
+
49
+ > 연산량의 측면보다는, 가독성의 측면에서 남긴 코멘트였어요. 테스트코드를 읽는 사람에게 머릿속으로 몇 번의 연산을 하도록 하기보다, 그저 아무런 계산 과정을 거치지 않고 주르륵 읽을 수 있게 도와주는 게 가장 좋은 테스트라고 생각해요
50
+ >
51
+ > — @malibinYun on `src/test/kotlin/domain/CarTest.kt`
52
+
53
+ ## 얻은 교훈
54
+
55
+ - **에러 메시지의 *문맥*은 비용 없는 디버깅 정보**. 입력값을 메시지에 담으면 운영에서 로그만 보고 원인 추정 가능. 안 담으면 재현 필요.
56
+ - **상수 이름 = "도메인 모르는 사람이 봐도 짐작 가능한가"** 테스트. `STANDARD`, `DEFAULT`, `CONSTANT`는 정보량 0.
57
+ - **테스트는 *계산 없이 주르륵*** 읽혀야. 머릿속 연산이 들어가면 그건 또 하나의 검증 부담. `isTrue()` 위에 boolean 식을 두면 두 번 연산.
58
+ - **경계값 테스트 = 정확한 두 점**. 4를 기준이라면 3 (실패) + 4 (성공) 두 케이스. ParameterizedTest는 케이스 ≥ 2일 때만 의미.
59
+ - **피드백 흡수 속도 = 다음 라운드의 깊이**. 학생이 한 라운드에서 모든 지적을 빠르게 받으면 다음 라운드는 더 미묘한 지적으로 격상.