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,48 @@
1
+ # PR #50 — [자동차 경주] 혜미 미션 제출합니다
2
+
3
+ - **Reviewee:** [@hyemdooly](https://github.com/hyemdooly)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/50
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @BeokBeok
7
+ - **라인 코멘트:** 12
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Cars, Car, RandomGenerator, Validator 분리**.
12
+ - **`require` + `throw` 활용**.
13
+ - **테스트 코드 풍부**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`RaceGame`(Controller)이 멤버 변수 다수** — 함수 결과 예측 어려움.
18
+ - **`Cars`가 우승자 찾기까지 담당** — 책임 두 가지 (리스트 관리 + 우승자 판단).
19
+ - **`Pair` 사용** — first/second가 무엇인지 모름. data class가 더 명확.
20
+ - **`CarInfo`와 `Car` 프로퍼티 중복** — 캡슐화 대상 동일.
21
+ - **0과 9 매직넘버**.
22
+ - **`Constants.kt` class + companion object** — object가 더 적합.
23
+ - **테스트에 두 케이스 한 함수** — 분리 권장.
24
+ - **`CarsHelper`라는 모호한 Helper 접미사**.
25
+
26
+ ## 리뷰어 의견 요지
27
+
28
+ 리뷰어 @BeokBeok의 메시지:
29
+
30
+ 1. **Pair 회피 → data class** — first/second는 의미 미상.
31
+ 2. **Cars의 책임 = 리스트 관리, 우승자는 별도 객체** — 두 책임을 한 클래스에 넣지 말 것.
32
+ 3. **`!!` 회피, 멤버 변수 회피** (의존성 주입 글 인용).
33
+ 4. **테스트 케이스는 한 함수 = 한 시나리오**.
34
+
35
+ - **대표 인용:**
36
+ > Pair는 두 개의 값을 편하게 wrapping할 수 있다는 장점이 있지만, first와 second가 어떤 것을 의미하는지 알기가 어렵습니다. Pair 대신 data class를 활용해보면 어떨까요?
37
+ >
38
+ > — @BeokBeok on `src/main/kotlin/model/Cars.kt`
39
+
40
+ > 하지만 Cars 클래스는 자동차의 리스트를 관리하는 책임을 가지고 있는데, 우승자를 찾는 함수로 인하여 우승자를 관리하는 책임까지 가지게 됩니다. 우승자를 찾는 책임을 갖는 클래스를 만들어보면 어떨까요?
41
+ >
42
+ > — @BeokBeok on `src/main/kotlin/model/Cars.kt`
43
+
44
+ ## 얻은 교훈
45
+
46
+ - **Pair는 *지름길*이지 *설계*가 아님**. 두 값이 영구히 함께 다닐 거면 data class. 일회용 반환이면 Pair OK.
47
+ - **일급 컬렉션의 책임 = 컬렉션 관리만**. 우승자 판단 같은 비즈니스 로직은 별도 객체. 일급 컬렉션이 god-object 되지 않게.
48
+ - **`Helper`/`Manager` 접미사 회피**. 클래스가 *무엇을* 돕는지 이름에 명시.
@@ -0,0 +1,53 @@
1
+ # PR #68 — [자동차 경주 - 리팩토링] 혜미 미션 제출합니다
2
+
3
+ - **Reviewee:** [@hyemdooly](https://github.com/hyemdooly)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/68
5
+ - **단계:** 1단계 (리팩토링)
6
+ - **리뷰어:** @BeokBeok
7
+ - **라인 코멘트:** 11
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **검증을 Controller로, 재입력 흐름 분리**.
12
+ - **방어적 복사 적용**.
13
+ - **backing property + custom getter 시도**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`Cars.move()`가 함수 내부에서 랜덤 생성** — 테스트 불가.
18
+ - **`Validator`가 OutputView 의존** — Controller 아닌 곳이 View 의존.
19
+ - **`CarsHelper` 여전히 모호한 이름**.
20
+ - **InputView에서 null 시 자기 재호출** — InputView 책임 침범.
21
+ - **`executeInputTryNumber` 같이 동사 두 개 (간접 호출)**.
22
+ - **backing property를 *생성자*에서 _xxx로** — 코틀린 컨벤션은 별도 위치.
23
+
24
+ ## 리뷰어 의견 요지
25
+
26
+ 리뷰어 @BeokBeok의 메시지:
27
+
28
+ 1. **간접 호출의 함정** — `executeInputTryNumber` = "execute" + "input". 동사 두 개. 함수는 한 동사.
29
+
30
+ 2. **backing property 컨벤션** — 생성자에 `_xxx` 두지 말고, 클래스 body에서 별도 선언.
31
+
32
+ 3. **빈 리스트 = `emptyList()` (가독성)**.
33
+
34
+ 4. **랜덤 의존성 분리** — `Cars.move` 안에 랜덤이 있으면 테스트 불가. 외부에서 주입.
35
+
36
+ 5. **Validator의 View 의존 제거** — Validator는 도메인 검증만, View는 Controller가 다룸.
37
+
38
+ - **대표 인용:**
39
+ > executeInputTryNumber함수보다는 inputTryNumber라는 함수가 더 잘 이해가 돼요. executeInputTryNumber함수를 사용하는 것을 "간접 호출"이라고 합니다. "간접 호출"은 유용한 경우도 많지만, 자칫 잘못하게 되면 과하게 함수를 호출하게 되는 상황을 만들기도 해요.
40
+ >
41
+ > — @BeokBeok on `src/main/kotlin/controller/RaceGame.kt`
42
+
43
+ > domain과 view에 둘 다 접근이 가능한 것은 Controller입니다. Controller의 역할에 대해서 다시 한번 학습해보시고, Validator는 Controller가 아니므로 OutputView의 의존성을 제거해보면 어떨까요?
44
+ >
45
+ > — @BeokBeok on `src/main/kotlin/util/Validator.kt`
46
+
47
+ ## 얻은 교훈
48
+
49
+ - **함수명에 동사는 *하나만***. `executeInput` = 두 동사. `executeXxx` 같은 간접 호출은 단순 `xxx`로 충분.
50
+ - **backing property는 *body 선언***. 생성자에 `_xxx`는 컨벤션 위반.
51
+ - **`emptyList()` vs `listOf()`** — 의미 명시.
52
+ - **랜덤은 함수 안이 아닌 *주입*으로**. 함수 안에 두면 테스트 시 결정적 결과 불가.
53
+ - **Validator의 View 의존 = 의존 방향 거꾸로**. Validator는 가장 안쪽 (도메인 가까이), View는 가장 바깥 (UI). 안쪽이 바깥을 알면 의존 역전.
@@ -0,0 +1,54 @@
1
+ # PR #29 — [뽀또] 코틀린 자동차 경주 제출합니다
2
+
3
+ - **Reviewee:** [@hyunji1203](https://github.com/hyunji1203)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/29
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @namjackson
7
+ - **라인 코멘트:** 14
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`NumberGenerator` 인터페이스 + 분리** — 리뷰어 명시적 칭찬.
12
+ - **Fake 객체로 결정적 테스트** — 리뷰어 칭찬.
13
+ - **생성자 주입 적용** — 리뷰어 칭찬.
14
+ - **테스트 코드 적극 작성** — 리뷰어 💯.
15
+
16
+ ## 못한 점 (설계 관점)
17
+
18
+ - **`lateinit var cars`로 지연 초기화** — 초기화 전 호출 시 에러 위험. 학생이 디폴트값 또는 생성자 주입으로 변경.
19
+ - **`resources/String.kt`로 문자열 모음** — 안드로이드 리소스 비슷. 결합도 증가.
20
+ - **`","`, `"-"` 매직 리터럴 인라인** — 상수화 가능.
21
+ - **테스트 이름 추상화** — "잘 작동하는지" 등 모호.
22
+ - **`GameController`가 `racingManager.over`를 알아야** — Controller 관심사가 아님. 메시지 위임으로.
23
+ - **`Fake` 객체에 list를 생성자 주입 안 함** — 재활용 어려움.
24
+ - **`result` 같은 모호한 변수명**.
25
+ - **`mutableListOf`를 val 대신 var로** — 가변 컬렉션이면 불변 변수가 자연스러움.
26
+
27
+ ## 리뷰어 의견 요지
28
+
29
+ 리뷰어 @namjackson는 lateinit의 위험성을 짚으면서 **"초기화를 강제하는 다른 방법(디폴트, 생성자 주입)"** 가이드. 학생이 즉시 흡수.
30
+
31
+ 또한 **"GameController가 race over를 안다 = 관심사 침해"** 라는 가이드 — 그 결정은 RacingManager가 직접 해야. Tell-Don't-Ask와 책임 위임의 명확한 적용.
32
+
33
+ 테스트 이름 명세화와 Given-When-Then 패턴 가이드는 다른 reviewees와 동일.
34
+
35
+ - **대표 인용:**
36
+ > lateinit는 초기화를 지연시킬수 있지만, 한편으로는 초기화 이전에 호출이 된다면 에러가 발생하곤 합니다! ... 디폴드값을 사용하거나, 생상자로 주입받는 방식 등이 있을거같은데, 고민해보셔도 좋을거같아요!
37
+ >
38
+ > — @namjackson on `src/main/kotlin/racingcar/domain/RacingManager.kt`
39
+
40
+ > GameController에서는 레이싱이 종료되었는지는 불필요한 관심사가 아닐까요? RacingManager 에게 메세지를 보내 race를 진행하는 책임을 위임해보면 어떨까요?
41
+ >
42
+ > — @namjackson on `src/main/kotlin/racingcar/controller/GameController.kt`
43
+
44
+ > "Car 객체의 이름은 1자 이상 5자 이하만 가능"이라는 테스트 케이스지만, 실제로는 ... 공백이나 6글자 이상의 이름으로 Car 객체 생성시, IllegalArgumentException 에러가 발생하는 부분을 테스트하고 있어요!
45
+ >
46
+ > — @namjackson on `src/test/kotlin/racingcar/domain/CarTest.kt`
47
+
48
+ ## 얻은 교훈
49
+
50
+ - **lateinit의 위험.** 초기화 전 접근 시 UninitializedPropertyAccessException. 생성자 주입 또는 디폴트값이 더 안전.
51
+ - **`Controller`가 도메인 상태(over)를 알면 책임 침해.** 도메인 객체가 자기 흐름을 알고 메시지로 진행 결과 알림.
52
+ - **테스트 이름과 검증 대상의 일치.** "1~5자 정상" 테스트가 실제로 "공백/6글자 예외"를 검증하면 이름이 거짓말. 한 테스트에 한 시나리오.
53
+ - **변수 가변성과 변수 자체의 가변성 분리.** `var mutableListOf<X>()`는 변수와 컬렉션 모두 가변. 컬렉션이 가변이면 변수는 보통 val로.
54
+ - **자료 추천 → 학생 흡수 → 적용** 의 학습 사이클이 한 PR에 다수 사례. lateinit 가이드 + 책임 위임 가이드 모두 학생이 즉시 반영.
@@ -0,0 +1,50 @@
1
+ # PR #60 — [뽀또] 2단계 자동차 경주 제출합니다
2
+
3
+ - **Reviewee:** [@hyunji1203](https://github.com/hyunji1203)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/60
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @namjackson
7
+ - **라인 코멘트:** 20
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`RaceResultDto` 도입 → 후속 라운드에서 삭제** — 필요 없음을 자기 회고로 인식.
12
+ - **`RaceManager`가 생성자로 names/count를 받도록 수정** — 사전 setGame 호출 제거.
13
+ - **자기 결정의 깊은 회고** — "Car의 기준이 변경되거나 이동 거리가 다양해진다면 Car에 책임 부여"라는 자기 판단을 명확히 표명.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`Car.location` 외부 수정 가능** — 원래대로 되돌렸지만 캡슐화 인식 필요.
18
+ - **`RaceResultDto`가 `List<List<Int>>` 사용** — 데이터 구조 의미 모호. names + cars 중복.
19
+ - **`Application.kt` main 함수가 비대** — 초기화 + 실행 흐름을 모두 처리.
20
+ - **roundHistory를 함수 내부 참조 방식으로 수정** — 반환값 사용이 더 단순.
21
+ - **테스트 이름이 모호** — "RaceResultDto 정상 반환 확인"이 무엇을 검증하는지 모름.
22
+
23
+ ## 리뷰어 의견 요지
24
+
25
+ 리뷰어 @namjackson는 **"이중 리스트 = 데이터 구조 신호"** 라는 가이드를 반복. `List<List<Int>>`가 보이면 항상 도메인 객체로 wrapping 후보. 자동차별 히스토리인지 step별 히스토리인지 시그니처만으로 모름.
26
+
27
+ 또한 **"setGame 호출 제약 = 생성자로 해결"** — 객체가 사용되기 전 별도 설정 메서드가 필요하면 그것은 깨지기 쉬운 API. 생성자에서 모두 받아 즉시 사용 가능한 상태로.
28
+
29
+ 학생이 "다양한 기준 → Car에 책임"이라는 답에 도달한 회고가 인상적 — 외부 Manager가 늘어나는 패턴을 피하려는 사고가 자연스럽게 객체에 책임 부여로 이어짐.
30
+
31
+ - **대표 인용:**
32
+ > List<List<Int>> 이중 리스트 구조는 어떤 데이터구조인지 알기가 힘들어지는데, List<Int>를 래핑해보면 어떨까요?
33
+ >
34
+ > — @namjackson on `src/main/kotlin/racingcar/domain/RaceResultDto.kt`
35
+
36
+ > 현재의 RaceManager는 race이전에 setGame을 호출해야하는 제약사항이 있어요! 기본값을 선언해주셔서, 에러는 나지않지만, 구현부를 보기전엔 이러한 제약사항을 파악하기는 힘들수도 있다는 생각이 들어요!
37
+ >
38
+ > — @namjackson on `src/main/kotlin/racingcar/domain/RaceManager.kt`
39
+
40
+ > "RaceResultDto 정상 반환 확인" 이라는 테스트 케이스명과 같은 모호한 이름은, 정상 반환에 대한 요구사항을 먼저 살펴봐야할것 같아요.
41
+ >
42
+ > — @namjackson on `src/test/kotlin/racingcar/domain/RaceManagerTest.kt`
43
+
44
+ ## 얻은 교훈
45
+
46
+ - **이중 컬렉션은 도메인 모델 누락의 신호.** `List<List<Int>>` / `Map<X, List<Y>>` 등이 보이면 의미 모호. 도메인 객체로 wrap.
47
+ - **생성과 사용 사이에 setup 메서드는 깨지기 쉬운 API.** 생성자가 끝나면 즉시 사용 가능해야. 별도 setX() 호출이 필요하면 사용자가 그 순서를 학습해야.
48
+ - **객체 책임 부여의 본질 = "외부 관리자 늘어남"의 회피.** Car 책임을 외부 Manager로 빼면 다양한 기준마다 새 Manager. Car 자신이 책임을 들면 확장이 Car의 변경으로 모임.
49
+ - **테스트 이름은 시나리오를 표현.** "정상 반환"은 무엇이 어떤 상태에서 어떤 반환을 하는지 안 알려줌. "2라운드 실행 시 2라운드 히스토리 반환" 같은 시나리오.
50
+ - **자기 회고를 통한 결정 = 진짜 학습.** 학생이 "기준이 다양해질 때 Car에 책임"이라는 답을 자기 추론으로 도달. 리뷰어의 가이드가 그 추론을 끌어냄.
@@ -0,0 +1,42 @@
1
+ # PR #102 — [자동차 경주] 인기 미션 제출합니다
2
+
3
+ - **Reviewee:** [@ii2001](https://github.com/ii2001)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/102
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @vagabond95
7
+ - **라인 코멘트:** 8
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **InputView/OutputView/model 분리**.
12
+
13
+ ## 못한 점 (설계 관점)
14
+
15
+ - **`main.kt`의 함수명이 명사** — 동사 컨벤션 위반.
16
+ - **`Car.position`이 String 타입** — 표현용 String을 도메인에 둠. Int가 도메인 의미.
17
+ - **`racing.kt`가 함수만 모아둠** — 클래스로 묶어야 Controller가 비즈니스 로직 직접 처리 안 함.
18
+ - **`goOrStop` 함수명 모호** — 무엇을 하는지 본문 봐야.
19
+ - **테스트 누락** — 입력값 검증, 자동차 움직임.
20
+
21
+ ## 리뷰어 의견 요지
22
+
23
+ 리뷰어 @vagabond95의 메시지:
24
+
25
+ 1. **함수 이름 = 동사형 (코드 컨벤션)**.
26
+
27
+ 2. **도메인 타입 = 도메인 의미를 반영** — position이 *증가/감소 가능한 성질*이면 Int. String으로 두면 표현 형식이 도메인을 침범.
28
+
29
+ 3. **함수 모음 파일 → 클래스로 묶기**. 함수만 노출하면 Controller가 비즈니스 로직을 *직접 호출*. MVC의 model 의미가 없어짐.
30
+
31
+ 4. **테스트 커버리지 = 입력 검증 + 자동차 움직임 필수**.
32
+
33
+ - **대표 인용:**
34
+ > position 을 String 타입으로 선언해주신 것은 실제로 postiion 을 표현 할 때 String 타입으로 이용되기 때문이라고 생각되는데요. model 의 경우 보통 도메인을 표현하는 영역이므로 실제 동작의 속성을 지켜주면 좋다고 생각합니다. position 은 증가(혹은 감소) 할 수 있는 성질이 있으므로, 숫자 타입으로 선언되면 좀 더 활용할 수 있는 범위가 넓지 않을까요~?
35
+ >
36
+ > — @vagabond95 on `src/main/kotlin/racingcar/model/Car.kt`
37
+
38
+ ## 얻은 교훈
39
+
40
+ - **도메인 타입 ≠ 표현 형식**. position이 표시에 String으로 쓰이더라도, 도메인은 *Int* (증가/감소 가능한 성질). 표현은 OutputView가 변환.
41
+ - **함수만 노출하는 model = 책임 누수**. Controller가 함수들을 직접 부르면 비즈니스 흐름이 Controller에 모임. model이 클래스로 묶여야 책임이 분배.
42
+ - **테스트 부재 = 검증 의지 부재**. "이 검증이 가치 있다"고 판단해서 model로 옮겼다면 *반드시* 테스트.
@@ -0,0 +1,49 @@
1
+ # PR #122 — [자동차 경주 - 리팩토링] 인기 미션 제출합니다
2
+
3
+ - **Reviewee:** [@ii2001](https://github.com/ii2001)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/122
5
+ - **단계:** 1단계 (리팩토링)
6
+ - **리뷰어:** @vagabond95
7
+ - **라인 코멘트:** 10
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **backing property 도입**.
12
+ - **자동차 이름 검증** + 입력값 메시지 표시.
13
+ - **상수화 진행**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`Car`가 여전히 var 선언 (외부 변경 가능)** — backing property로 보완.
18
+ - **`racing.kt` 함수 모음 잔존** — 클래스로 묶지 않음.
19
+ - **상수 옆 주석으로 부연** — 변경 시 주석도 동기화 필요.
20
+ - **`-` 매직 문자열 (출력)** — 상수화.
21
+ - **포매팅 (reformat) 누락**.
22
+ - **private 가시성 일부 누락**.
23
+
24
+ ## 리뷰어 의견 요지
25
+
26
+ 리뷰어 @vagabond95의 메시지:
27
+
28
+ 1. **`var position; private set`이 backing property보다 *간결*** — 같은 효과, 변수 하나.
29
+
30
+ 2. **함수 모음 → 클래스 캡슐화 재강조** — "객체를 객체스럽게" 글 인용. 함수만 제공 시 Controller-model 구분 무의미.
31
+
32
+ 3. **주석 → 상수로 표현력 대체**. 상수 이름이 의미를 담으면 주석 불필요. 주석은 변경 동기화 부담.
33
+
34
+ 4. **reformat IDE 기능 활용**.
35
+
36
+ - **대표 인용:**
37
+ > 해당 파일의 함수들을 적절한 클래스로 묶어서 클래스 내부에서 처리해볼 수 있을까요? 이러한 방식으로 함수만 제공이 될 경우 controller 에서 모든 비즈니스 로직을 직접 처리해야하는데, 이 경우 controller 와 model 을 나눈 의미가 없어질 것 같아요.
38
+ >
39
+ > — @vagabond95 on `src/main/kotlin/racingcar/model/racing.kt`
40
+
41
+ > 주석으로 추가 정보를 남겨주는 것도 좋지만, 이럴 경우 요구사항이 바뀔때마다 주석도 같이 변경되어야하므로 관리포인트가 늘어난다고 할 수 있습니다. "-" 값을 상수로 선언하고 활용한다면 주석 없이도 충분히 설명력 있는 코드가 되지 않을까요?
42
+ >
43
+ > — @vagabond95 on `src/main/kotlin/racingcar/view/output.kt`
44
+
45
+ ## 얻은 교훈
46
+
47
+ - **`private set` vs backing property**. 원시값이면 `private set`이 변수 1개로 충분. 컬렉션은 mutableXXX 외부 노출 회피로 backing property 필요.
48
+ - **주석은 코드의 *복사본*이 아닌 *이유***. 의미는 상수 이름에, 주석은 *왜* 필요한지.
49
+ - **함수 모음 = 객체지향 아님**. 클래스로 묶으면 *상태*와 *행위*가 한 곳에. 협력자도 명확.
@@ -0,0 +1,57 @@
1
+ # PR #144 — [자동차 경주] 크림 미션 제출합니다
2
+
3
+ - **Reviewee:** [@ijh1298](https://github.com/ijh1298)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/144
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @lee-ji-hoon
7
+ - **라인 코멘트:** 27
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Validator를 별도 클래스로 분리** — 책임 분리 시도.
12
+ - **자기 의문을 PR에 명시 (object vs class, lateinit, validation 위치)** — 토론의 시작점 풍부.
13
+ - **피드백 흡수 후 자기 근거 재정리** — "RacingController는 cars만 받아 racing 흐름만 관리"로 수정.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`RacingController.run`이 너무 많은 일** — input validation, view 호출, racing 진행, 결과 출력까지.
18
+ - **Controller가 `lateinit var`로 입력값을 필드에 보관** — `run`이 비대해진 신호. 지역 변수로 충분.
19
+ - **Controller가 InputView/OutputView 직접 의존** — "Racing을 진행한다"는 책임에 IO는 불필요.
20
+ - **`Car.move(randomNum)`가 외부에서 받은 숫자가 임계값 넘는지 판단** — Car가 알 일 아님. 경기 규칙(>=4)도 Car의 자리 아님.
21
+ - **`InputValidator` 분리는 했지만 어디서 호출될지 모호** — 클래스만 만들고 자리 미정.
22
+ - **Car init 블록에 validate 옮김 (근거 없이)** — 다른 크루 따라함.
23
+ - **`RandomGenerator` object의 테스트성 문제 미인지** — 싱글톤 = 모킹 어려움.
24
+
25
+ ## 리뷰어 의견 요지
26
+
27
+ 리뷰어 @lee-ji-hoon은 **"질문으로 학생 스스로 답을 찾게 하는" 스타일**의 리뷰. 직접 정답을 주지 않고 "이 클래스가 이 일을 하는 게 맞을까?"를 반복.
28
+
29
+ 1. **Controller의 본질 질문** — "MVC 모르는 상태에서 Controller가 View를 의존할 필요가 있을까?" → 학생이 View 의존성 제거하자 다음 리팩토링에서 더 깊게 다루자고 예고.
30
+
31
+ 2. **`move()` 책임** — "Car는 그냥 move() 호출되면 움직여야 하는 거 아닐까?" → 임계값 판단은 경기 규칙, Car가 알 일 아님. 학생이 SRP 위반 인지.
32
+
33
+ 3. **object 테스트성** — "object라고 무조건 테스트 어려운 건 아니다 (validateEmail 같은 순수 함수). 그럼 *언제* 어려운가?"를 스스로 생각하게.
34
+
35
+ 4. **Validation 위치는 학생의 기준** — "리뷰어들이 의견을 남길 테니 항상 본인 의견을 이야기하는 습관"이 더 중요.
36
+
37
+ - **대표 인용:**
38
+ > Racing을 run 할 때 사용할 함수들인데 지역 변수로 빼는게 더 깔끔해보이는 이유는 run이 너무 많은 역할을 하고 있기 때문이 아닐까요?
39
+ >
40
+ > — @lee-ji-hoon on `src/main/kotlin/controller/RacingController.kt`
41
+
42
+ > RacingController 입장에서 생성이 될 때 Input / Output View들을 알아야 할 이유가 있을까요? RacingController 의 역할은 Racing을 진행하고 그 결과를 보여줘야 하지 않을까 하는데
43
+ >
44
+ > — @lee-ji-hoon on `src/main/kotlin/controller/RacingController.kt`
45
+
46
+ > move라는 함수 역할 기준으로 봤을 때 randomNum 이라는 파라미터를 받는 것과 여기서 STANDARD_NUMBER 를 넘는지 받는게 맞을까요?
47
+ >
48
+ > — @lee-ji-hoon on `src/main/kotlin/domain/Car.kt`
49
+
50
+ ## 얻은 교훈
51
+
52
+ - **"지역 변수로 빼면 깔끔해진다"는 메서드가 비대하다는 신호.** lateinit var의 유혹은 보통 한 메서드가 여러 책임을 갖기 때문에 생긴다. 책임을 쪼개면 변수는 따라 들어간다.
53
+ - **Controller의 본질은 "흐름 제어"이지 "IO 보유"가 아니다.** Racing을 진행하는 객체가 InputView를 알아야 할 이유는 없다.
54
+ - **메서드 이름의 약속 = 그 안의 코드.** `move()`는 움직임만, `moveOrStop()`은 조건 판단까지. 이름이 SRP를 강제.
55
+ - **다른 사람의 패턴을 자기 근거 없이 따라하지 말 것.** "다른 크루가 init에서 validate하길래"는 결국 자기 코드에 정착하지 않는다.
56
+ - **object의 단위 테스트 어려움은 "싱글톤 + 의존 모킹"의 조합 문제이지 object 자체 문제가 아니다.** 순수 함수 object는 멀쩡히 테스트 가능.
57
+ - **리뷰는 답을 주는 게 아니라 질문으로 학생의 기준을 만들게 하는 도구** — 학생이 매번 "내 의견은 이렇다"로 말하는 게 다음 단계.
@@ -0,0 +1,58 @@
1
+ # PR #24 — [자동차 경주] 콩하 미션 제출합니다
2
+
3
+ - **Reviewee:** [@injoon2019](https://github.com/injoon2019)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/24
5
+ - **단계:** 2단계 (단일 PR, 3 reviewers)
6
+ - **리뷰어:** @kbsat, @cjlee38, @jayjaehunchoi
7
+ - **라인 코멘트:** 18
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Position 별도 객체** — 원시 강박 탈출.
12
+ - **`AlwaysMoveStrategy` 인터페이스 + 전략 패턴** — 테스트용 결정적 전략.
13
+ - **Cars 일급 컬렉션 후보** — `cars.map { it.moveForward(strategy) }`.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **Position의 디폴트 값 처리 미흡** — 보조 생성자 대신 디폴트 인자.
18
+ - **Car.move가 전략을 안 받음** — 인터페이스 만들어놓고 미적용.
19
+ - **Position 검증 `if-throw` 대신 require/check 미사용**.
20
+ - **테스트 코드 어색함** — Position 비교를 `isSamePosition()` 대신 `==`로 충분.
21
+
22
+ ## 리뷰어 의견 요지
23
+
24
+ 3명의 리뷰어가 협력해서 코틀린 idiom + OOP 개념을 토론.
25
+
26
+ 1. **`require`/`check`로 검증 단순화** — 코틀린 idiom. `IllegalArgumentException` 자동.
27
+
28
+ 2. **식이 본문인 함수** — `override fun isMovable(): Boolean = true`. 한 줄 함수는 `=` 표현.
29
+
30
+ 3. **kotest 도입 권장** — `shouldBeTrue()`, `shouldThrow<>`, `position1 shouldBe position2` 같은 자연스러운 DSL.
31
+
32
+ 4. **companion object의 의미** — "특정 클래스의 support 역할, static과는 다른 녀석" (cjlee38 인용 블로그).
33
+
34
+ 5. **인터페이스 만들고 미적용** — Strategy 인터페이스가 Car에 적용되어 있나? 학생 답: "Cars에 적용. Car에는 미적용."
35
+
36
+ 6. **`maxByOrNull` 같은 안전 컬렉션 API**.
37
+
38
+ - **대표 인용:**
39
+ > 이미 보셨을수도 있지만 [bsidesoft.com 링크] companion object 는 특정 클래스의 support 역할을 해주는, static 과는 조금 다른 녀석이라고 생각해요.
40
+ >
41
+ > — @cjlee38 on `src/main/kotlin/racingcar/domain/Cars.kt:16`
42
+
43
+ > 전략 안쓰는데요? 😋
44
+ >
45
+ > — @kbsat on `src/main/kotlin/racingcar/domain/Car.kt`
46
+
47
+ > 모든 중괄호를 개행할 필요는 없을것같네용
48
+ >
49
+ > — @cjlee38 on `src/main/kotlin/racingcar/domain/Cars.kt`
50
+
51
+ ## 얻은 교훈
52
+
53
+ - **인터페이스를 만들었다면 *반드시 사용*하기**. 전략 패턴 인터페이스 만들고 Car에 안 쓰면 "선언만 한 죽은 추상". 리뷰어가 즉시 잡음.
54
+ - **`require` + `check`의 의미 차이**. `require` = 인자 검증 (IllegalArgumentException), `check` = 상태 검증 (IllegalStateException). 사용자 입력 = require, 객체 내부 invariant = check.
55
+ - **companion object ≠ Java static**. Companion은 *그 클래스의 컴패니언 인스턴스*. 메서드/속성도 일반 클래스처럼 가질 수 있음. 진정한 static은 Kotlin에서 top-level이나 `@JvmStatic`.
56
+ - **kotest의 DSL** = "사람이 읽는 영어 문장". `position1 shouldBe position2`는 assertion이 아니라 *주장*처럼 읽힘. 테스트 가독성에 큰 이점.
57
+ - **여러 리뷰어가 한 PR에 모이면 협력적 학습** — 각자 다른 관점 (코틀린 idiom, OOP, 테스트). 학생이 한 라운드에 여러 깊이의 토론을 동시에 받음.
58
+ - **`maxByOrNull` = 안전 default 미반환**. 빈 컬렉션 시 null 반환 → null 처리 강제. 빈 컬렉션에서 max 부르는 잠재적 NPE 차단.
@@ -0,0 +1,60 @@
1
+ # PR #44 — [자동차 경주 - 1단계] 인선 미션 제출합니다
2
+
3
+ - **Reviewee:** [@inseonyun](https://github.com/inseonyun)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/44
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @BeokBeok
7
+ - **라인 코멘트:** 19
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **Controller, View, Model, Exception 패키지 분리** — MVC 의식.
12
+ - **`NameException`, `TryCountException` 별도 객체로 검증 분리**.
13
+ - **메시지 상수 `ExceptionMessage` 분리**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **Controller가 멤버 변수 다수 보유** — 함수 호출마다 결과 예측 어려움 (의존성 주입 글 참고).
18
+ - **`getCarNames()` 같은 함수가 *반환 안 함*** — 이름이 거짓말.
19
+ - **`NameException`, `TryCountException` 이름이 Exception이지만 *Exception 타입 아님*** — 검증 객체에 Exception 접미사.
20
+ - **`ExceptionMessage`가 class with companion object** — 캡슐화할 게 없으면 object.
21
+ - **재귀 입력 호출이 Controller에서 발생** — 입력 책임은 InputView에.
22
+ - **`DEFAULT_TRY_COUNT` private 미적용** — 외부 공개 불필요.
23
+ - **`DomainTest`가 여러 도메인 테스트** — Test 클래스는 1:1 매핑이 표준.
24
+ - **요구사항 체크박스 미반영** — README 진행 상태 불일치.
25
+ - **테스트 함수명에 "테스트" 단어 중복**.
26
+
27
+ ## 리뷰어 의견 요지
28
+
29
+ 리뷰어 @BeokBeok의 핵심 가르침:
30
+
31
+ 1. **멤버 변수 의존 vs 의존성 주입** — "멤버 변수에 따라 함수 호출 시 결과가 매번 달라져 예측 어려움." Imposter's Guide to DI 글 인용.
32
+
33
+ 2. **함수명 = 외부에서 본 행위 + 반환값** — `getCarNames()`가 안 반환하면 거짓말. `setupCarNames()` 같은 이름이 진실.
34
+
35
+ 3. **클래스명 = 그 클래스의 *책임*** — `Exception` 접미사인데 Exception 타입 아니면 동료 혼란. `Validation` 접미사로 바꿔야.
36
+
37
+ 4. **`require`/`check` vs 조건문 throw** — require/check가 가독성, 스마트캐스팅 이점. 코틀린 idiom에 가까움.
38
+
39
+ 5. **클래스 vs object 선택 기준** — "클래스는 최소 하나의 캡슐화. 그렇지 않으면 object." 상수만 있는 클래스는 object로.
40
+
41
+ - **대표 인용:**
42
+ > 멤버 변수를 활용하면 클래스 내부에서 값을 편하게 가져다 쓸 수 있는 장점이 있지만, 멤버 변수의 값에 따라 함수 호출 시 결과가 매번 달라지게 되서, 함수의 결괏값을 예측하기가 어려워져요.
43
+ >
44
+ > — @BeokBeok on `src/main/kotlin/controller/RacingGameController.kt`
45
+
46
+ > 클래스명을 보니 Exception을 custom한 것으로 보이지만, 실제로는 Exception 타입이 아니네요. 이 클래스가 하는 책임에 대해서 다시 한번 고민해보면 어떨까요?
47
+ >
48
+ > — @BeokBeok on `src/main/kotlin/exception/TryCountException.kt`
49
+
50
+ > 대체로 클래스는 최소한 하나 이상을 캡슐화를 해야합니다. 그렇지 않으면, 클래스를 사용하는 것 보다는 object를 사용하는 것을 권장합니다.
51
+ >
52
+ > — @BeokBeok on `src/main/kotlin/message/ExceptionMessage.kt`
53
+
54
+ ## 얻은 교훈
55
+
56
+ - **멤버 변수는 *함수의 입력*을 가린다.** 같은 함수를 두 번 호출해도 멤버 변수가 바뀌었으면 다른 결과. *순수 함수*로 갈수록 예측 가능, 테스트 가능.
57
+ - **클래스명 = 책임 ≠ 사용처**. "Exception" 접미사는 *Exception 타입*을 의미. 검증 객체는 `Validation` / `Validator`. 이름은 사용자가 *유추할 수 있는* 의미여야.
58
+ - **`require`/`check`의 가독성 이점** — `if (!cond) throw ...` 5줄이 `require(cond) { msg }` 1줄. 스마트캐스팅도 자연스럽게 적용.
59
+ - **클래스 = 캡슐화. object = static.** 상수만 있는 클래스는 캡슐화할 게 없음 → object.
60
+ - **Test 클래스 1:1 매핑**. `CarTest`는 Car만, `CarsTest`는 Cars만. `DomainTest`처럼 묶으면 어디서 무엇이 깨졌는지 추적 어려움.
@@ -0,0 +1,53 @@
1
+ # PR #76 — [자동차 경주 - 2단계] 인선 미션 제출합니다
2
+
3
+ - **Reviewee:** [@inseonyun](https://github.com/inseonyun)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/76
5
+ - **단계:** 2단계
6
+ - **리뷰어:** @BeokBeok
7
+ - **라인 코멘트:** 8
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **`Validation` 클래스로 검증 책임 분리** — Exception 이름 → Validation.
12
+ - **`Service` 레이어 도입** — 도메인 비즈니스 로직 분리.
13
+
14
+ ## 못한 점 (설계 관점)
15
+
16
+ - **`NameValidation`이 OutputView 의존** — Validation은 Controller도 View도 아닌데 View를 알면 안 됨.
17
+ - **InputView에서 입력값 유효할 때까지 반복** — InputView의 책임 확장.
18
+ - **`RacingCarGameService.kt`에 출력 문구 작성** — 출력은 OutputView 책임.
19
+
20
+ ## 리뷰어 의견 요지
21
+
22
+ 리뷰어 @BeokBeok의 메시지:
23
+
24
+ 1. **Validation의 의존 방향** — "Validation은 Controller가 아닙니다. 즉, View와 관련된 의존성을 가지면 안 됩니다." Validation = 순수 검증 함수, 결과는 호출 측이 판단.
25
+
26
+ 2. **InputView의 책임 재정의** — "InputView는 입력값을 받아서 전달하는 역할일 뿐. 올바른 입력값을 받을 때까지 계속 호출하는 것과는 별개." 반복은 호출 측이.
27
+
28
+ 3. **재귀 입력의 *적절한 자리*** — "inputName()을 호출한 곳에서 반환값을 판단. 유효하지 않으면 inputName()을 다시 한 번 호출." → 호출 측의 책임.
29
+
30
+ 4. **출력 책임 일원화** — Service에 출력 문구 만들지 말 것. OutputView로.
31
+
32
+ 5. **"유효한 값을 받을 때까지 종료되지 않는다는 요구사항은 없다"** — 학생이 만든 가상의 요구사항으로 책임이 부풀어 오름.
33
+
34
+ - **대표 인용:**
35
+ > Validation은 Controller가 아닙니다. 즉, View와 관련된 의존성을 가지면 안됩니다. OutView의 의존성을 가지지 않도록 코드를 개선해보면 어떨까요?
36
+ >
37
+ > — @BeokBeok on `src/main/kotlin/validation/NameValidation.kt`
38
+
39
+ > InputView가 어떤 책임을 갖는지 다시 한번 생각해보시면 좋을 것 같아요. InputView는 입력값을 받아서 전달하는 역할을 할 뿐이지, 올바른 입력값을 받을때까지 계속해서 호출하는 것과는 별개입니다.
40
+ >
41
+ > — @BeokBeok on `src/main/kotlin/view/InputView.kt`
42
+
43
+ > 참고로 프로그래밍 요구사항에는 "유효한 값을 받을때까지 프로그램이 종료되지 않는다"와 같은 항목은 없습니다. 😅
44
+ >
45
+ > — @BeokBeok on `src/main/kotlin/view/InputView.kt`
46
+
47
+ ## 얻은 교훈
48
+
49
+ - **Validation의 의존 방향 = 순수 함수에 가깝게**. View나 Controller 의존 없이 입력 → 결과 (bool/exception). 결과 해석은 호출 측.
50
+ - **InputView의 책임 = "받아서 넘기기"**. 검증, 재시도, 형식 변환은 모두 호출 측 (Controller) 또는 Validation. View가 너무 많이 하면 동료가 InputView 안에서 비즈니스 로직 추적해야 함.
51
+ - **재귀 입력은 *호출 측*에서**. View가 재귀 호출하면 View가 흐름 제어. 호출 측에서 `validate(input) ? input : inputView.read()` 형태가 깨끗.
52
+ - **자가 요구사항 생성의 위험**. "유효한 값까지 종료되지 않게"라는 요구사항이 없는데 학생이 가정. 그 가정이 책임 누수의 원인.
53
+ - **출력 책임 일원화**. 출력 문구가 도메인/Service/Controller 어디에든 생기면 변경 시 추적 어려움. OutputView 한 곳에.
@@ -0,0 +1,54 @@
1
+ # PR #36 — [글로] 코틀린 자동차 경주 제출합니다
2
+
3
+ - **Reviewee:** [@ippnsj](https://github.com/ippnsj)
4
+ - **PR:** https://github.com/woowacourse/kotlin-racingcar/pull/36
5
+ - **단계:** 1단계
6
+ - **리뷰어:** @malibinYun
7
+ - **라인 코멘트:** 12
8
+
9
+ ## 잘한 점 (설계 관점)
10
+
11
+ - **DTO 패턴 도입 시도** — CarsDTO, WinnersDTO로 데이터 운반 책임 분리.
12
+ - **`Judgement` 별도 객체** — 우승자 판별 책임 분리 시도.
13
+ - **`NumberGenerator` 분리**.
14
+
15
+ ## 못한 점 (설계 관점)
16
+
17
+ - **`CarsDTO`가 검증 + 가공 수행** — DTO의 정체성 위반. DTO는 단순 데이터 운반.
18
+ - **`Controller`에 cars 멤버 변수** — 게임 단위 라이프사이클.
19
+ - **`Controller.inputCarNames(): Boolean`** — 자동차를 받을 것 같은 메서드명이 Boolean 반환.
20
+ - **`Judgement`의 우승자 알고리즘 복잡** — O(n) 두 번이 O(2n)에 비해 더 단순/가독.
21
+ - **`Car.checkGo(number)`가 in range 비교** — `in 4..9` 같은 코틀린 표현 활용 가능.
22
+ - **테스트가 production 로직으로 데이터 빌드** — 변경에 약함. 하드코딩이 더 안정.
23
+
24
+ ## 리뷰어 의견 요지
25
+
26
+ 리뷰어 @malibinYun는 **DTO의 정체성** 을 강하게 짚었다. "이름 그대로 데이터를 전달만 하는 객체" — 검증/가공은 다른 책임자에게.
27
+
28
+ 또한 **"테스트는 하드코딩이 더 가독성 좋다"** 는 비교 가이드. 학생이 "하드코딩이 좋지 않다고만 생각했다"는 응답에 대해 "직접 비교해보고 다른 사람 의견 들어보라"는 메타 학습 가이드 + 자료 추천.
29
+
30
+ `Judgement`의 알고리즘 단순화 — "두 번 탐색이 O(2n)이지만 더 단순하고 가독성 높다"는 trade-off 표현. 학생이 즉시 흡수.
31
+
32
+ `inputCarNames(): Boolean` 시그니처 거짓말에 대해 "입력 다시 받기는 InputView의 일"이라는 책임 위치 가이드.
33
+
34
+ - **대표 인용:**
35
+ > dto가 값을 가공하고, 검증하고 있는 것이 매우 어색합니다. dto는 이름 그대로 데이터를 전달만 하는 객체입니다.
36
+ >
37
+ > — @malibinYun on `src/main/kotlin/dto/CarsDTO.kt:22`
38
+
39
+ > 우승자를 구하기 위해 복잡한 로직이 들어가고 있어 가독성이 떨어집니다. 단순하게, 가장 멀리있는 자동차의 거리를 구하고, 그 거리에 있는 자동차들을 구해보는 것은 어떨까요?
40
+ >
41
+ > — @malibinYun on `src/main/kotlin/domain/Judgement.kt:22`
42
+
43
+ > 필요한 값을 하드 코딩으로 적은 것과, 로직으로 적은 것을 비교해보고, 어떤 것이 테스트 코드를 읽을 때 편한지 스스로와 다른 사람들에게 의견을 들어보는 것은 어떨까요?
44
+ >
45
+ > — @malibinYun on `src/test/kotlin/domain/JudgementTest.kt:13`
46
+
47
+ ## 얻은 교훈
48
+
49
+ - **DTO의 정체성 = 데이터 운반.** 검증/가공/계산은 DTO의 일이 아님. DTO에 로직이 생기면 그것은 사실 다른 객체.
50
+ - **알고리즘 단순함 vs 효율.** O(n) 1회 vs O(n) 2회는 사실상 같은 클래스. 가독성이 우선. 진짜 성능 문제가 생긴 후 최적화.
51
+ - **테스트 하드코딩의 가치.** "DRY 원칙"이 테스트에 그대로 적용되지 않음. 테스트는 시나리오 명세이므로 데이터가 명시될수록 가독성.
52
+ - **시그니처 거짓말 = 호출자 혼란.** `inputCarNames: Boolean`은 메서드 이름과 반환 타입이 어긋남. 호출자가 함수 본문을 봐야.
53
+ - **`in range` 표현 활용** — 코틀린의 `number in 4..9`가 `number >= 4 && number <= 9`보다 가독성 + 의도.
54
+ - **메타 학습 가이드의 가치** — "왜 그렇게 생각했는지 직접 비교해보고 의견을 들어라"는 가이드는 학생이 자기 추론을 검증하는 훈련.