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.
- package/MCP_STRUCTURE.md +301 -0
- package/README.md +167 -0
- package/SCOPE.md +27 -0
- package/dist/application/discovery.d.ts +133 -0
- package/dist/application/discovery.js +62 -0
- package/dist/application/discovery.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/collaborators.d.ts +2 -0
- package/dist/domain/collaborators.js +26 -0
- package/dist/domain/collaborators.js.map +1 -0
- package/dist/domain/ids.d.ts +4 -0
- package/dist/domain/ids.js +23 -0
- package/dist/domain/ids.js.map +1 -0
- package/dist/domain/model.d.ts +71 -0
- package/dist/domain/model.js +2 -0
- package/dist/domain/model.js.map +1 -0
- package/dist/domain/schemas.d.ts +213 -0
- package/dist/domain/schemas.js +79 -0
- package/dist/domain/schemas.js.map +1 -0
- package/dist/domain/stereotypes.d.ts +7 -0
- package/dist/domain/stereotypes.js +65 -0
- package/dist/domain/stereotypes.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/io/classStore.d.ts +9 -0
- package/dist/io/classStore.js +39 -0
- package/dist/io/classStore.js.map +1 -0
- package/dist/io/collaborationStore.d.ts +7 -0
- package/dist/io/collaborationStore.js +32 -0
- package/dist/io/collaborationStore.js.map +1 -0
- package/dist/io/design.d.ts +3 -0
- package/dist/io/design.js +22 -0
- package/dist/io/design.js.map +1 -0
- package/dist/io/designIndex.d.ts +6 -0
- package/dist/io/designIndex.js +49 -0
- package/dist/io/designIndex.js.map +1 -0
- package/dist/io/frontmatter.d.ts +8 -0
- package/dist/io/frontmatter.js +31 -0
- package/dist/io/frontmatter.js.map +1 -0
- package/dist/io/history.d.ts +10 -0
- package/dist/io/history.js +38 -0
- package/dist/io/history.js.map +1 -0
- package/dist/io/useCaseStore.d.ts +8 -0
- package/dist/io/useCaseStore.js +36 -0
- package/dist/io/useCaseStore.js.map +1 -0
- package/dist/io/workspace.d.ts +14 -0
- package/dist/io/workspace.js +82 -0
- package/dist/io/workspace.js.map +1 -0
- package/dist/oop/commands.d.ts +446 -0
- package/dist/oop/commands.js +319 -0
- package/dist/oop/commands.js.map +1 -0
- package/dist/oop/conformance.d.ts +16 -0
- package/dist/oop/conformance.js +30 -0
- package/dist/oop/conformance.js.map +1 -0
- package/dist/prompts/discovery.d.ts +2 -0
- package/dist/prompts/discovery.js +41 -0
- package/dist/prompts/discovery.js.map +1 -0
- package/dist/prompts/imagineWithoutController.d.ts +2 -0
- package/dist/prompts/imagineWithoutController.js +75 -0
- package/dist/prompts/imagineWithoutController.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/phasePressureTest.d.ts +2 -0
- package/dist/prompts/phasePressureTest.js +69 -0
- package/dist/prompts/phasePressureTest.js.map +1 -0
- package/dist/prompts/rddIntro.d.ts +2 -0
- package/dist/prompts/rddIntro.js +53 -0
- package/dist/prompts/rddIntro.js.map +1 -0
- package/dist/prompts/review.d.ts +2 -0
- package/dist/prompts/review.js +45 -0
- package/dist/prompts/review.js.map +1 -0
- package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
- package/dist/prompts/stateMachineIntrospect.js +80 -0
- package/dist/prompts/stateMachineIntrospect.js.map +1 -0
- package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
- package/dist/prompts/tellDontAskRephrase.js +66 -0
- package/dist/prompts/tellDontAskRephrase.js.map +1 -0
- package/dist/render/diff.d.ts +21 -0
- package/dist/render/diff.js +84 -0
- package/dist/render/diff.js.map +1 -0
- package/dist/render/mermaid.d.ts +24 -0
- package/dist/render/mermaid.js +53 -0
- package/dist/render/mermaid.js.map +1 -0
- package/dist/render/sideBySide.d.ts +14 -0
- package/dist/render/sideBySide.js +91 -0
- package/dist/render/sideBySide.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.js +349 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/alternatives.d.ts +2 -0
- package/dist/tools/alternatives.js +9 -0
- package/dist/tools/alternatives.js.map +1 -0
- package/dist/tools/classes.d.ts +2 -0
- package/dist/tools/classes.js +13 -0
- package/dist/tools/classes.js.map +1 -0
- package/dist/tools/collaborations.d.ts +2 -0
- package/dist/tools/collaborations.js +8 -0
- package/dist/tools/collaborations.js.map +1 -0
- package/dist/tools/compare.d.ts +2 -0
- package/dist/tools/compare.js +9 -0
- package/dist/tools/compare.js.map +1 -0
- package/dist/tools/conformance.d.ts +3 -0
- package/dist/tools/conformance.js +11 -0
- package/dist/tools/conformance.js.map +1 -0
- package/dist/tools/diagram.d.ts +2 -0
- package/dist/tools/diagram.js +9 -0
- package/dist/tools/diagram.js.map +1 -0
- package/dist/tools/discovery.d.ts +2 -0
- package/dist/tools/discovery.js +23 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/init.d.ts +2 -0
- package/dist/tools/init.js +9 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/oop.d.ts +9 -0
- package/dist/tools/oop.js +26 -0
- package/dist/tools/oop.js.map +1 -0
- package/dist/tools/responsibilities.d.ts +2 -0
- package/dist/tools/responsibilities.js +13 -0
- package/dist/tools/responsibilities.js.map +1 -0
- package/dist/tools/state.d.ts +2 -0
- package/dist/tools/state.js +8 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/useCases.d.ts +2 -0
- package/dist/tools/useCases.js +18 -0
- package/dist/tools/useCases.js.map +1 -0
- package/dist/tools/validate.d.ts +2 -0
- package/dist/tools/validate.js +9 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tradeoff/engine.d.ts +61 -0
- package/dist/tradeoff/engine.js +171 -0
- package/dist/tradeoff/engine.js.map +1 -0
- package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
- package/dist/tradeoff/heuristics/classSplit.js +94 -0
- package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
- package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
- package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
- package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collectionShape.js +113 -0
- package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
- package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
- package/dist/tradeoff/heuristics/errorHandling.js +110 -0
- package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
- package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
- package/dist/tradeoff/templates.d.ts +2 -0
- package/dist/tradeoff/templates.js +33 -0
- package/dist/tradeoff/templates.js.map +1 -0
- package/dist/util/log.d.ts +1 -0
- package/dist/util/log.js +7 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/mcp.d.ts +4 -0
- package/dist/util/mcp.js +18 -0
- package/dist/util/mcp.js.map +1 -0
- package/dist/validate/cohesion.d.ts +3 -0
- package/dist/validate/cohesion.js +88 -0
- package/dist/validate/cohesion.js.map +1 -0
- package/dist/validate/collectionWrapper.d.ts +3 -0
- package/dist/validate/collectionWrapper.js +131 -0
- package/dist/validate/collectionWrapper.js.map +1 -0
- package/dist/validate/coupling.d.ts +3 -0
- package/dist/validate/coupling.js +47 -0
- package/dist/validate/coupling.js.map +1 -0
- package/dist/validate/cycle.d.ts +3 -0
- package/dist/validate/cycle.js +101 -0
- package/dist/validate/cycle.js.map +1 -0
- package/dist/validate/dataDuplication.d.ts +3 -0
- package/dist/validate/dataDuplication.js +150 -0
- package/dist/validate/dataDuplication.js.map +1 -0
- package/dist/validate/dependencyDirection.d.ts +3 -0
- package/dist/validate/dependencyDirection.js +106 -0
- package/dist/validate/dependencyDirection.js.map +1 -0
- package/dist/validate/dualUseKnowing.d.ts +3 -0
- package/dist/validate/dualUseKnowing.js +137 -0
- package/dist/validate/dualUseKnowing.js.map +1 -0
- package/dist/validate/emptyObjectFill.d.ts +3 -0
- package/dist/validate/emptyObjectFill.js +119 -0
- package/dist/validate/emptyObjectFill.js.map +1 -0
- package/dist/validate/findings.d.ts +22 -0
- package/dist/validate/findings.js +12 -0
- package/dist/validate/findings.js.map +1 -0
- package/dist/validate/functionDecompositionExcess.d.ts +3 -0
- package/dist/validate/functionDecompositionExcess.js +120 -0
- package/dist/validate/functionDecompositionExcess.js.map +1 -0
- package/dist/validate/functionNotObject.d.ts +3 -0
- package/dist/validate/functionNotObject.js +80 -0
- package/dist/validate/functionNotObject.js.map +1 -0
- package/dist/validate/godObject.d.ts +6 -0
- package/dist/validate/godObject.js +76 -0
- package/dist/validate/godObject.js.map +1 -0
- package/dist/validate/presentationInDomain.d.ts +3 -0
- package/dist/validate/presentationInDomain.js +57 -0
- package/dist/validate/presentationInDomain.js.map +1 -0
- package/dist/validate/primitiveWrapper.d.ts +3 -0
- package/dist/validate/primitiveWrapper.js +106 -0
- package/dist/validate/primitiveWrapper.js.map +1 -0
- package/dist/validate/rules.d.ts +24 -0
- package/dist/validate/rules.js +269 -0
- package/dist/validate/rules.js.map +1 -0
- package/dist/validate/singletonStatefulHolder.d.ts +3 -0
- package/dist/validate/singletonStatefulHolder.js +128 -0
- package/dist/validate/singletonStatefulHolder.js.map +1 -0
- package/dist/validate/strategyAsymmetry.d.ts +3 -0
- package/dist/validate/strategyAsymmetry.js +131 -0
- package/dist/validate/strategyAsymmetry.js.map +1 -0
- package/dist/validate/testability.d.ts +5 -0
- package/dist/validate/testability.js +157 -0
- package/dist/validate/testability.js.map +1 -0
- package/dist/validate/vagueName.d.ts +3 -0
- package/dist/validate/vagueName.js +136 -0
- package/dist/validate/vagueName.js.map +1 -0
- package/dist/validate/validationLocation.d.ts +3 -0
- package/dist/validate/validationLocation.js +120 -0
- package/dist/validate/validationLocation.js.map +1 -0
- package/lessons/STYLE_GUIDE.md +304 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
- package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
- package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
- package/lessons/woowacourse-racingcar/README.md +69 -0
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
- 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
- package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/package.json +46 -0
- package/skills/oh-my-oop/SKILL.md +39 -0
|
@@ -0,0 +1,678 @@
|
|
|
1
|
+
# PR #143 — [블랙잭 2단계] 메다 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@medAndro](https://github.com/medAndro)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/143
|
|
5
|
+
- **단계:** 2단계
|
|
6
|
+
- **리뷰어:** [@hyemdooly](https://github.com/hyemdooly) (둘리) — 1단계 #130 동일 reviewer (학생 → reviewer 진화 2번째 사례)
|
|
7
|
+
- **라인 코멘트:** 19 스레드 — *PR 본문 자가 의문 + 페어 학습 인용 + 슬랙 페토 글 인용 + `-0.0` Float IEEE 754 함정 자가 학습 (PR #131 결 재발견) + 3 인스턴스 변수 제약 학생 자가 비판 + *원래 그리던 꿈을 펼쳐볼까* 어휘 + custom get vs function 학생 자가 4 분류 + HandCards 승패 판단 + BetAmount.profit + Dealer 합산 (책임 분리) + ProfitRate enum + Profit value class*
|
|
8
|
+
- **양 단계 완성 reviewee** (1단계 #130 batch 20 분석 완료 + 2단계 #143 = batch 21 추가).
|
|
9
|
+
|
|
10
|
+
## 잘한 점 (설계 관점)
|
|
11
|
+
|
|
12
|
+
### 1. PR 본문 자가 의문 + 페어 학습 + 슬랙 페토 글 인용
|
|
13
|
+
|
|
14
|
+
PR 본문:
|
|
15
|
+
|
|
16
|
+
> *"step1 피드백 반영할 수 있는 부분은 반영하고 step1 코멘트에 남긴 의문점들도 아직 남아있어서 반영되지 않은 부분도 있는데 답글 달아주시는대로 공부하며 리팩터링 해봐야겠습니다.*
|
|
17
|
+
>
|
|
18
|
+
> *Step2를 일단 기능을 빠르게 구현 완료하긴 했는데 의식의 흐름대로 짜서 이게 맞나 싶기도 한 코드가 된 것 같네요*
|
|
19
|
+
>
|
|
20
|
+
> *`3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.`를 지키기 위해서 BetHistory를 따로 두었으며*
|
|
21
|
+
> *`ProfitStatistics`에서 일단 getter를 써서 구현해 보았는데 언제 함수를 쓰고 언제 getter를 쓰는지는 슬랙의 페토의 글을 보고 주말에 공부좀 해봐야 될 것 같습니다.*
|
|
22
|
+
>
|
|
23
|
+
> *오늘 직접 방문해주셔서 이야기 나눌수 있어서 좋았어요 :)"*
|
|
24
|
+
|
|
25
|
+
→ **학생 자가 학습 정점**:
|
|
26
|
+
- *step1 의문점 미해결 자가 인정* — *학습 시간성*.
|
|
27
|
+
- *의식의 흐름 코드 자가 인정* — *학습 한계 인정* (PR #139 *진흙탕 코드* 결).
|
|
28
|
+
- *3 인스턴스 변수 제약 명시* — *형식 규칙 인지*.
|
|
29
|
+
- *슬랙 페토 글 인용* — *외부 자료 자가 학습*.
|
|
30
|
+
- *직접 방문 reviewer 만남* — *오프라인 페어 학습*.
|
|
31
|
+
|
|
32
|
+
**MCP `oh-my-oop` *학습 = 시간 두고 반복* 어휘 정점**. PR #130 학생 자가 한계 4 종 인정 → PR #143 자가 한계 + 외부 자료 + 오프라인 만남 (4 자리). 누적 5+ PR 학생 자가 한계 인정.
|
|
33
|
+
|
|
34
|
+
### 2. `BetAmount` (value class + invariant) + `Profit` (value class + Double) + `ProfitRate` (enum + calculate) — 책임 분리
|
|
35
|
+
|
|
36
|
+
```kotlin
|
|
37
|
+
@JvmInline value class BetAmount(val value: Int) {
|
|
38
|
+
init { require(value > MINIMUM_BET_AMOUNT) { ... } }
|
|
39
|
+
fun calculateProfit(profitRate: ProfitRate): Profit = Profit(profitRate.value * value)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@JvmInline value class Profit(val value: Double)
|
|
43
|
+
|
|
44
|
+
enum class ProfitRate(val value: Double) {
|
|
45
|
+
BLACKJACK_WIN(1.5), NORMAL_WIN(1.0), DRAW(0.0), LOSE(-1.0);
|
|
46
|
+
|
|
47
|
+
companion object {
|
|
48
|
+
fun calculateProfitRate(winLoss: WinLoss, cardStatus: CardStatus): ProfitRate = when (winLoss) {
|
|
49
|
+
WinLoss.WIN -> if (cardStatus == CardStatus.BLACKJACK) BLACKJACK_WIN else NORMAL_WIN
|
|
50
|
+
WinLoss.LOSE -> LOSE
|
|
51
|
+
WinLoss.DRAW -> DRAW
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
→ **3 객체 분리 + 각각 책임 명확**:
|
|
58
|
+
- `BetAmount`: *invariant + Profit 계산*.
|
|
59
|
+
- `Profit`: *value class + Double*.
|
|
60
|
+
- `ProfitRate`: *enum + 결과/상태 조합 → rate*.
|
|
61
|
+
|
|
62
|
+
reviewer (Thread 8) *"이런 1.5배, 1배 이런 것들도 어떤 한 클래스에 묶어 관리될 수 있을 것 같아요."* → 학생 자가 적용.
|
|
63
|
+
|
|
64
|
+
#### 2.1. *PR #130·#35·#36·#87·#138 결의 *enum + cashOut* 어휘 합류*
|
|
65
|
+
|
|
66
|
+
PR #142 (doabletuple) `GameResult.cashOut(player)` 와 *반대 시점 (`ProfitRate.value * betAmount` 직접 계산)* — *enum 책임 강화 정공*.
|
|
67
|
+
|
|
68
|
+
### 3. `WinLoss` + `ProfitRate` 분리 — 결과 vs 수익률 분리
|
|
69
|
+
|
|
70
|
+
```kotlin
|
|
71
|
+
enum class WinLoss { WIN, DRAW, LOSE }
|
|
72
|
+
|
|
73
|
+
enum class ProfitRate(val value: Double) { BLACKJACK_WIN, NORMAL_WIN, DRAW, LOSE }
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
→ **2 enum 분리** — *결과 (WIN/DRAW/LOSE 3 종) + 수익률 (4 종: 블랙잭 분기 포함)*. PR #142 (`GameResult` 5 멤버 단일) 와 *반대 시점 (분리)*.
|
|
77
|
+
|
|
78
|
+
#### 3.1. *2 가지 트레이드오프*
|
|
79
|
+
|
|
80
|
+
| 안 | 장점 | 단점 |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| `WinLoss` + `ProfitRate` 분리 (현재) | *결과 분류 + 수익률 분리 = 책임 명확* | *2 enum + calculateProfitRate 매핑 함수 필요* |
|
|
83
|
+
| `GameResult` 5 멤버 단일 (PR #142) | *단일 객체 + 호출 간결* | *결과 + 수익률 한 자리 책임 ↑* |
|
|
84
|
+
|
|
85
|
+
**MCP 룰 `result-vs-rate-enum-separation` 후보** — *결과 vs 수익률 분리 트레이드오프*.
|
|
86
|
+
|
|
87
|
+
### 4. `data class GameParticipants(dealer, players)` + `profitInfos` computed property
|
|
88
|
+
|
|
89
|
+
```kotlin
|
|
90
|
+
data class GameParticipants(val dealer: Dealer, val players: List<Player>) {
|
|
91
|
+
val gameParticipants: List<GameParticipant> get() = listOf(dealer) + players
|
|
92
|
+
|
|
93
|
+
val profitInfos: List<ProfitInfo>
|
|
94
|
+
get() {
|
|
95
|
+
val dealerProfitInfo = ProfitInfo(dealer.name, dealer.allPlayersMatchProfit(players))
|
|
96
|
+
val playersProfitInfos = players.map { player -> ProfitInfo(player.name, player.dealerMatchProfit(dealer)) }
|
|
97
|
+
return listOf(dealerProfitInfo) + playersProfitInfos
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
→ **`GameParticipants` 일급 컬렉션 + computed property** = PR #142 (Game 분리) 결의 *Scoreboard* 객체와 유사 패턴.
|
|
103
|
+
|
|
104
|
+
### 5. 학생 자가 *원래 그리던 꿈을 펼쳐볼까* (Thread 15) — 형식 규칙 자가 비판
|
|
105
|
+
|
|
106
|
+
reviewer (Thread 15): *"`participantInfo`의 존재 이유가 무엇일까요? 딜러는 `betAmount`가 필요없지 않을까요? 🤔"*
|
|
107
|
+
|
|
108
|
+
학생:
|
|
109
|
+
|
|
110
|
+
> *"대단한 이유는 없고 `3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.`를 지키기 위해서 사용되었습니다. 둘리 외에 어떤 공룡 리뷰어가 `요구사항을 지켜야 하지만 좋은 설계라고 생각하면 가끔은 깨부셔도..?` 라며 원래 그리던 꿈을 펼쳐보라는 리뷰를 다시는 것을 보았는데 저도 원래 그리던 꿈을 펼쳐볼까 합니다."*
|
|
111
|
+
|
|
112
|
+
→ **형식 규칙 자가 비판 + 다른 reviewer 어휘 인용 ("원래 그리던 꿈을 펼쳐보라")** = *PR #138 (rosemin928 *"인스턴스 변수 유지라는 요구사항에 맞추기 위해 묶지 않아도 될 것을 계속 묶고 있나?"*) 결의 *형식 규칙 부산물 자가 비판* 어휘 강화 + *다른 reviewer 어휘 cross-reference*.
|
|
113
|
+
|
|
114
|
+
**MCP 룰 `form-rule-artificial-grouping-self-critique` 강화** 누적 2+ PR (#138·#143).
|
|
115
|
+
|
|
116
|
+
**MCP 룰 `peer-reviewer-cross-reference` 후보** — *학생이 다른 reviewer 어휘 인용 + 자가 적용*.
|
|
117
|
+
|
|
118
|
+
### 6. `-0.0f` Float IEEE 754 함정 학생 자가 학습 + 조사
|
|
119
|
+
|
|
120
|
+
reviewer (Thread 5): *"-0 방지가 어떤 뜻인가요? 0.0f 더해주신 이유가 궁금해요!"*
|
|
121
|
+
|
|
122
|
+
학생 자가 답변:
|
|
123
|
+
|
|
124
|
+
> *"현재 딜러의 수익은 `플레이어의 수익의 합의 역`으로 계산하고 있어서 -를 붙이기 때문에 `플레이어의 수익의 합`이 0일 경우 0에 -를 붙여 -0으로 표시되는 문제가 발생하는걸 확인하였고 원인을 조사하다가 코틀린에서 float는 `-0.0f`와 `0.0f`를 구분한다는 것을 알게 되었습니다. 조건문을 걸어서 해결하는 방법도 있지만 `0.0f`를 더하는게 가장 간편한 해결책인것 같아서 추가하게 되었습니다."*
|
|
125
|
+
|
|
126
|
+
```kotlin
|
|
127
|
+
fun allPlayersMatchProfit(players: Collection<Player>): Profit {
|
|
128
|
+
val playersProfitSum = players.sumOf { player -> player.dealerMatchProfit(this).value }
|
|
129
|
+
return Profit(-playersProfitSum + 0.0) // ← -0.0 방지
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
→ **`-0.0` IEEE 754 함정 자가 학습 + 조사 + 해결책** = PR #131 (Leeyerin0210 *Double IEEE 754 함정 우회*) 결의 *학생 자가 재발견*. **MCP 룰 `negative-zero-floating-point-trap` 강화** 누적 2+ PR (#131·#143).
|
|
134
|
+
|
|
135
|
+
#### 6.1. *학생 자가 학습 깊이*
|
|
136
|
+
|
|
137
|
+
- 문제 인식 (`-0` 표시).
|
|
138
|
+
- 원인 조사 (`-0.0f` vs `0.0f` 구분).
|
|
139
|
+
- 해결책 비교 (조건문 vs `+ 0.0` 더하기).
|
|
140
|
+
- 자가 선택 (간편한 해결책).
|
|
141
|
+
|
|
142
|
+
**Kotlin/Java 어휘 깊은 자가 학습**.
|
|
143
|
+
|
|
144
|
+
### 7. `dealerMatchProfit(dealer)` Tell-Don't-Ask + Player ↔ Dealer 자가 비교
|
|
145
|
+
|
|
146
|
+
```kotlin
|
|
147
|
+
fun dealerMatchProfit(dealer: Dealer): Profit {
|
|
148
|
+
val profitRate = ProfitRate.calculateProfitRate(this.winLoss(dealer), this.cardStatus)
|
|
149
|
+
return betAmount.calculateProfit(profitRate)
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
→ **Player 가 dealer 와 자가 비교 + Profit 자가 계산 + Tell-Don't-Ask 정공** = PR #129·#138·#142·#126 결 합류.
|
|
154
|
+
|
|
155
|
+
### 8. custom get vs function 학생 자가 4 분류
|
|
156
|
+
|
|
157
|
+
reviewer (Thread 16):
|
|
158
|
+
|
|
159
|
+
> *"커스텀 get() 프로퍼티로 구현하는 경우와 함수로 구현하는 경우는 어떻게 구분하면 좋을지 메다의 생각이 궁금해요!"*
|
|
160
|
+
|
|
161
|
+
학생 자가 답변:
|
|
162
|
+
|
|
163
|
+
> *"커스텀 get() 프로퍼티*
|
|
164
|
+
> *- 클라이언트가 해당 값을 객체의 속성처럼 생각할 것 같을 경우*
|
|
165
|
+
> *- 단순한 객체의 상태를 받아 올 경우*
|
|
166
|
+
>
|
|
167
|
+
> *함수*
|
|
168
|
+
> *- 값을 가져오기 위해 파라미터가 필요한 경우*
|
|
169
|
+
> *- 값을 가져오는것이 아닌 객체를 변화시키는 조정자로 쓰일 경우*
|
|
170
|
+
>
|
|
171
|
+
> *로 정리했습니다. 이 기준에 따라서 다른 코드들도 수정해봐야 할 것 같네요"*
|
|
172
|
+
|
|
173
|
+
→ **Kotlin 어휘 자가 4 분류** = PR #117 (parkjiminnnn *property val vs computed property*) 결 + PR #138 (rosemin928 *value class @JvmInline*) 결의 *Kotlin 어휘 자가 학습 정점*.
|
|
174
|
+
|
|
175
|
+
**MCP 룰 `property-vs-function-criteria` 후보** — *property (속성/상태) vs function (파라미터/조정자) 구분 기준 4 분류*.
|
|
176
|
+
|
|
177
|
+
### 9. 추가 칭찬
|
|
178
|
+
|
|
179
|
+
- Thread 12: *"이제 한번에 세팅해줄 수 있겠어요 👍"* (HandCards 부생성자 vararg).
|
|
180
|
+
- Thread 16: *"Participant의 initCards 오버라이딩을 활용하여 다르게 보여주도록 구현했네요 👍"*.
|
|
181
|
+
- 모든 19 스레드 학생 자가 답변 + commit SHA (일부 미적용 = 답변만).
|
|
182
|
+
|
|
183
|
+
## 못한 점 (설계 관점)
|
|
184
|
+
|
|
185
|
+
### 1. Deck 컨트롤러 외부 주입 vs 내부 생성
|
|
186
|
+
|
|
187
|
+
reviewer (Thread 1): *"Deck을 컨트롤러 밖에서 생성해서 주입해준 이유가 있으신가요?"*
|
|
188
|
+
|
|
189
|
+
학생 자가 답변:
|
|
190
|
+
|
|
191
|
+
> *"덱을 만들어서 주입하면 더 유연하게 운영 가능하지 않을까 생각했습니다. 현재와 같이 생성자를 생략하면 52장의 랜덤 카드가 카지노에게 주어지고 경우에 따라서는 2벌의 카드를 섞어서 사용하거나 섞지 않고 줄 수도 있으니까요"*
|
|
192
|
+
|
|
193
|
+
reviewer:
|
|
194
|
+
|
|
195
|
+
> *"오호 그렇군요! 저는 덱 생성을 컨트롤러 안에서 해도 되지 않을까?라고 생각했어요!🤔"*
|
|
196
|
+
|
|
197
|
+
→ **DI vs 내부 생성 트레이드오프**:
|
|
198
|
+
|
|
199
|
+
| 안 | 장점 | 단점 |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| 외부 주입 (학생) | *유연성 (다른 Deck 가능) + 테스트* | *호출자가 Deck 어휘 알아야 함* |
|
|
202
|
+
| 내부 생성 (reviewer) | *호출자 간결* | *유연성 ↓ + 테스트 어려움* |
|
|
203
|
+
|
|
204
|
+
PR #138 (rosemin928 *Deck interface + DI*) 결의 *외부 주입 정공* 어휘 합류. **MCP 룰 `dependency-injection-vs-internal-creation` 후보**.
|
|
205
|
+
|
|
206
|
+
다만 *reviewer 와 학생 의견 차이 = MCP `oop_propose_alternatives` 핵심 가치 합류*.
|
|
207
|
+
|
|
208
|
+
### 2. `player.addCard(card)` Player 메서드 vs `deck.draw` 직접 (1단계 결 진화)
|
|
209
|
+
|
|
210
|
+
reviewer (Thread 2): *"player에게 카드를 추가하라고 하는 것은 어떨까요?"*
|
|
211
|
+
|
|
212
|
+
학생 자가 답변:
|
|
213
|
+
|
|
214
|
+
> *"step1 PR에서 적은 궁금증에 관한 내용인 것 같습니다. (...) 와 같이 굳이? handCard에 메서드를 감싸는 쓸데없는 코드만 늘어나는것 아닌가 라는 생각으로 의도적으로 player에게 카드를 추가하라는 메서드는 만들지 않았습니다. (...) 현재 제가 생각한 대안으로*
|
|
215
|
+
> ```kt
|
|
216
|
+
> fun cardDraw(deck: Deck) {
|
|
217
|
+
> handCards.addCard(deck.getCard())
|
|
218
|
+
> }
|
|
219
|
+
> ```
|
|
220
|
+
> *와 같이 deck을 player가 참조하게 해서 player객체에게 드로우 하라는 메시지를 보내는 방식이 괜찮을 것 같다고 생각했습니다."*
|
|
221
|
+
|
|
222
|
+
학생 코드 (실제 적용):
|
|
223
|
+
|
|
224
|
+
```kotlin
|
|
225
|
+
fun fromDeckCardDraw(deck: Deck) {
|
|
226
|
+
handCards.cardAdd(deck.popCard())
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
→ **Player.fromDeckCardDraw(deck)** = *Tell-Don't-Ask + 도메인 메시지* + *위임 메서드 (handCards.cardAdd) 추가 책임 X* = *학생 1단계 자가 의문 (위임 메서드 = 쓸데없는 코드) 자가 해결*.
|
|
231
|
+
|
|
232
|
+
다만 **`fromDeckCardDraw` 명명 양가** — *영어 어순 어색 (`drawFromDeck` 정공)*. **MCP 룰 `english-word-order-naming` 후보**. PR #87 (Aginst), PR #130 (bulidPlayers) 결 합류.
|
|
233
|
+
|
|
234
|
+
### 3. 카드 이니셜 = 비즈니스 vs View 학생 자가 의문
|
|
235
|
+
|
|
236
|
+
reviewer (Thread 9): *"`intial`은 비즈니스 로직일까요, 뷰를 위한 로직일까요?"*
|
|
237
|
+
|
|
238
|
+
학생 자가 답변:
|
|
239
|
+
|
|
240
|
+
> *"현재로서는 View만을 위해 기능하고 있고 View를 위한게 맞는 것 같습니다. 다만 카드 이니셜은 고정된 값이고 앞으로도 변할 일이 없는 단순히 표시 목적을 넘어 카드의 본질적인 특성이라고 생각해서 가지고 있는 편이 좋을 것 같다고 생각했습니다. 가령 이니셜 스트링을 사용해서 Enum 객체를 가져올 수 있도록 만든다면 편리하겠네요"*
|
|
241
|
+
|
|
242
|
+
→ **카드 이니셜 = 표시 vs 본질 양가** = *PR #126 (Verdict 출력 문자열) vs PR #142 (에러 메시지 = Model OK)* 결의 *변경 가능성 = View 책임 vs 도메인 본질 = Model OK* 트레이드오프 합류.
|
|
243
|
+
|
|
244
|
+
**MCP 룰 `view-format-as-domain-invariant-tradeoff` 후보** — *표시 형식 vs 도메인 본질 트레이드오프*.
|
|
245
|
+
|
|
246
|
+
### 4. `participantInfo` 인공 객체 자가 인지 — 형식 규칙 부산물
|
|
247
|
+
|
|
248
|
+
§5 참조. 학생 자가 비판 + *원래 그리던 꿈을 펼쳐볼까* 어휘.
|
|
249
|
+
|
|
250
|
+
다만 **`participantInfo` 가 *실제 코드에는 없음*** = *PR 본문에 *BetHistory* 언급 → 2단계 최종 코드는 `BetAmount` (Player 멤버)* — *형식 규칙 자가 비판 후 자가 제거 정공*. PR #138 (BlackJackTable 자가 제거) 결과 같은 패턴.
|
|
251
|
+
|
|
252
|
+
### 5. `Player(name, betAmount)` 2 변수 vs Dealer 1 변수 — Dealer 가 BetAmount 없음
|
|
253
|
+
|
|
254
|
+
```kotlin
|
|
255
|
+
class Player(name: String = DEFAULT_NAME, private val betAmount: BetAmount) : GameParticipant(name = name)
|
|
256
|
+
class Dealer(name: String = DEFAULT_NAME) : GameParticipant(name = name)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
→ **Player ↔ Dealer 비대칭 (Dealer 는 BetAmount X)** = PR #87 (jaeyeongjo `DealerInfo.getBetAmount() = 0` Dummy zero) 결의 *반대 시점 (Dealer 가 BetAmount 멤버 자체 없음)* 정공.
|
|
260
|
+
|
|
261
|
+
reviewer (Thread 19): *"`BetAmount`의 기본값이 왜 1이 되었을까요? 😢 딜러 때문이라면 딜러는 `BetAmount`를 안가져도 될 것 같아요!"*
|
|
262
|
+
|
|
263
|
+
→ **reviewer 가 *Dealer 가 BetAmount 가져야 하는지* 추궁** = *학생의 1차 안 (BetAmount 기본값 1) → 2차 안 (Dealer 가 BetAmount 안 가짐)*.
|
|
264
|
+
|
|
265
|
+
**MCP 룰 `dummy-zero-for-domain-absent` 강화** 누적 2+ PR (#87·#143). *Dealer 가 BetAmount 가짐 vs 안 가짐 양가 = 학생 자가 학습 진화*.
|
|
266
|
+
|
|
267
|
+
### 6. `GameParticipant` `protected val handCards: HandCards = HandCards()` — 매 인스턴스 신규 생성 + 초기 카드 X
|
|
268
|
+
|
|
269
|
+
```kotlin
|
|
270
|
+
abstract class GameParticipant(val name: String) {
|
|
271
|
+
abstract val initCards: List<Card>
|
|
272
|
+
abstract val isDrawFinish: Boolean
|
|
273
|
+
protected val handCards: HandCards = HandCards() // ← 매 인스턴스 신규 생성, 카드 X
|
|
274
|
+
...
|
|
275
|
+
fun fromDeckCardDraw(deck: Deck) {
|
|
276
|
+
handCards.cardAdd(deck.popCard())
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
→ **HandCards 초기 비어 있음 + 외부에서 cardAdd 호출** = *호출 순서 invariant 부재* (PR #142 lateinit, PR #139 var betAmount 결).
|
|
282
|
+
|
|
283
|
+
대안:
|
|
284
|
+
- `GameParticipant(cards: List<Card>)` 생성자 인자 (초기 카드 보유).
|
|
285
|
+
- `Player(name, cards, betAmount)` (3 변수 — 형식 규칙 위반? 도메인 정합).
|
|
286
|
+
|
|
287
|
+
학생의 부생성자 `Player(betAmount, cards)` 활용 시 초기 카드 보유. *호출자 책임*.
|
|
288
|
+
|
|
289
|
+
### 7. `ProfitRate.calculateProfitRate(winLoss, cardStatus)` companion 정적
|
|
290
|
+
|
|
291
|
+
```kotlin
|
|
292
|
+
companion object {
|
|
293
|
+
fun calculateProfitRate(winLoss: WinLoss, cardStatus: CardStatus): ProfitRate = when (winLoss) {
|
|
294
|
+
WinLoss.WIN -> if (cardStatus == CardStatus.BLACKJACK) BLACKJACK_WIN else NORMAL_WIN
|
|
295
|
+
WinLoss.LOSE -> LOSE
|
|
296
|
+
WinLoss.DRAW -> DRAW
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
→ **enum companion 정적 메서드 + 외부 인자 2개 (winLoss, cardStatus)** = *Tell-Don't-Ask 부분 위반*. *Player 가 `ProfitRate.calculateProfitRate(this.winLoss(dealer), this.cardStatus)` 호출* = *외부 호출 + enum 정적*.
|
|
302
|
+
|
|
303
|
+
대안: **`WinLoss.toProfitRate(cardStatus: CardStatus): ProfitRate`** (WinLoss enum 에 메서드) — *enum 책임 강화*.
|
|
304
|
+
|
|
305
|
+
**MCP 룰 `enum-static-vs-instance-method-locator` 후보**.
|
|
306
|
+
|
|
307
|
+
### 8. `BetAmount.MINIMUM_BET_AMOUNT = 0` (이전 1) — 학생 자가 학습 시점
|
|
308
|
+
|
|
309
|
+
```kotlin
|
|
310
|
+
private const val MINIMUM_BET_AMOUNT = 0
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
→ **`MINIMUM_BET_AMOUNT = 0` + `require(value > 0)`** = *베팅 ≥ 1원*. PR #138 (1000원), PR #142 (0원 가능) 결과 다른 값.
|
|
314
|
+
|
|
315
|
+
**MCP 룰 `domain-rule-arbitrary-constant` 강화** 누적 4+ PR.
|
|
316
|
+
|
|
317
|
+
### 9. `Player.initCards: List<Card> get() = cards.subList(0, 2)` — sublist 직접 노출
|
|
318
|
+
|
|
319
|
+
```kotlin
|
|
320
|
+
override val initCards: List<Card> get() = cards.subList(0, 2)
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
→ **`subList` 외부 노출 + `cards.subList(0, 2)` 직접 indexing** = *Tell-Don't-Ask 위반 (`cards` 외부 호출 + subList)*. *HandCards 가 자가 처리 (예: `handCards.firstN(2)`) 가 정공*.
|
|
324
|
+
|
|
325
|
+
대안: `HandCards.initCardsOf(count: Int): List<Card>` (PR #138 `Hand.show(count)` 결).
|
|
326
|
+
|
|
327
|
+
### 10. `Dealer.allPlayersMatchProfit(players: Collection<Player>)` — 외부 players 인자
|
|
328
|
+
|
|
329
|
+
```kotlin
|
|
330
|
+
fun allPlayersMatchProfit(players: Collection<Player>): Profit {
|
|
331
|
+
val playersProfitSum = players.sumOf { player -> player.dealerMatchProfit(this).value }
|
|
332
|
+
return Profit(-playersProfitSum + 0.0)
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
→ **Dealer 가 외부 players 인자 받음 + Dealer 자체는 players 멤버 X** = *PR #142 (Scoreboard.dealerProfit(players) 외부 인자 vs 멤버) 결과 같은 *redundant-parameter-vs-member* 가 아닌 *외부 의존 명시 정공* 변형*.
|
|
337
|
+
|
|
338
|
+
**MCP 룰 `external-collection-as-method-arg-vs-member` 후보** — *외부 컬렉션 인자 = 의존 명시 vs 멤버 보유*.
|
|
339
|
+
|
|
340
|
+
### 11. `GameParticipants.profitInfos: List<ProfitInfo> get() = ...` — computed property + 매 호출 시 재계산
|
|
341
|
+
|
|
342
|
+
```kotlin
|
|
343
|
+
val profitInfos: List<ProfitInfo>
|
|
344
|
+
get() {
|
|
345
|
+
val dealerProfitInfo = ProfitInfo(dealer.name, dealer.allPlayersMatchProfit(players))
|
|
346
|
+
val playersProfitInfos = players.map { ... }
|
|
347
|
+
return listOf(dealerProfitInfo) + playersProfitInfos
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
→ **`get()` 매 호출 시 재계산** = *비용 ↑* (PR #117·#143 결의 *property val vs computed property* 트레이드오프).
|
|
352
|
+
|
|
353
|
+
대안: `val profitInfos = ...` (즉시 초기화) — *결과 1회 계산*. 다만 *players 변경 시 = stale*. **MCP 룰 `computed-property-vs-val-recompute-cost` 후보**.
|
|
354
|
+
|
|
355
|
+
### 12. `GameParticipant.winLoss(rival)` `protected` — Player 만 호출
|
|
356
|
+
|
|
357
|
+
```kotlin
|
|
358
|
+
protected fun winLoss(rival: GameParticipant): WinLoss = handCards.versusRivalWinLoss(rival.cardStatus, rival.bestValue)
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
→ **`protected` 가시성** = *자식 (Player/Dealer) 만 호출* + *외부 차단*. PR #87·#117 결의 *protected 가시성 정공*.
|
|
362
|
+
|
|
363
|
+
### 13. `HandCards.cardAdd(card)` 명명 양가 — `addCard` 가 정공
|
|
364
|
+
|
|
365
|
+
```kotlin
|
|
366
|
+
fun cardAdd(card: Card) { ... }
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
→ **`cardAdd` 영어 어순 어색** (`addCard` 정공). PR #87·#130 결의 *영문 명명 정확성*. **MCP 룰 `english-word-order-naming` 강화** 누적 2+ PR.
|
|
370
|
+
|
|
371
|
+
### 14. `MutableList` 직접 사용 + 방어적 복사 자가 학습
|
|
372
|
+
|
|
373
|
+
reviewer (Thread 12):
|
|
374
|
+
|
|
375
|
+
> *"이제 한번에 세팅해줄 수 있겠어요 👍 다만 이렇게 MutableList로 받아서 바로 내부에서 사용한다면 어떤 문제가 있을까요?"*
|
|
376
|
+
|
|
377
|
+
학생 자가 답변:
|
|
378
|
+
|
|
379
|
+
> *"외부에서 참조를 가지고 있을 경우 HandCard 외부에서 내부의 값을 조작할 수 있겠네요. 방어적 복사를 적용 해보도록 하겠습니다."*
|
|
380
|
+
|
|
381
|
+
→ **MutableList 외부 참조 위험 자가 인지 + 방어적 복사 자가 학습** = PR #21·#117·#138 (mutable-list-public-exposure) 결 합류.
|
|
382
|
+
|
|
383
|
+
### 15. PlayerTest 사라짐 (Deck object 제거 부작용)
|
|
384
|
+
|
|
385
|
+
reviewer (Thread 4):
|
|
386
|
+
|
|
387
|
+
> *"PlayerTest가 사라졌군요 😢 이김에 participant 패키지에 있는 모델들 테스트 작성도 하면 좋을 것 같아요!"*
|
|
388
|
+
|
|
389
|
+
학생:
|
|
390
|
+
|
|
391
|
+
> *"Deck이 Object가 아니게 되면서 사라졌는데 말씀 주신대로 participant 패키지의 테스트들을 추가해야겠네요..."*
|
|
392
|
+
|
|
393
|
+
→ **테스트 회귀 = Deck object 제거 부작용** + **테스트 추가 권유**. PR #87 (테스트 = 객체 설계 명세서) 결 + PR #130 (Singleton Deck 테스트 어려움) 결 합류.
|
|
394
|
+
|
|
395
|
+
**MCP 룰 `test-regression-from-deck-refactor` 후보** — *Deck 리팩터링 = 테스트 영향*.
|
|
396
|
+
|
|
397
|
+
### 16. `getFirstCard()` → `openInitialHand` 추상 메서드 자가 학습
|
|
398
|
+
|
|
399
|
+
reviewer (Thread 11):
|
|
400
|
+
|
|
401
|
+
> *"이쯤에서 한번 고민해보면 좋을 것 같아요. 딜러가 첫 턴에 카드를 두 장 뽑고나서 한 장만 보여주는 것은 비즈니스 로직일까요, 뷰의 로직일까요?"*
|
|
402
|
+
|
|
403
|
+
학생:
|
|
404
|
+
|
|
405
|
+
> *"비즈니스 로직이라고 생각해서 딜러 클래스에 getFirstCard()를 만들고 호출시켰는데 리뷰를 읽고 생각해보니 초기 카드를 가져오는 추상 메서드를 GameParticipant에 만들고 딜러와 플레이어 클래스에서 각각 구체화 시키는게 좋을 것 같네요"*
|
|
406
|
+
|
|
407
|
+
학생 자가 적용 (실제 코드):
|
|
408
|
+
```kotlin
|
|
409
|
+
// Participant
|
|
410
|
+
abstract val initCards: List<Card>
|
|
411
|
+
|
|
412
|
+
// Player
|
|
413
|
+
override val initCards: List<Card> get() = cards.subList(0, 2)
|
|
414
|
+
|
|
415
|
+
// Dealer
|
|
416
|
+
override val initCards: List<Card> get() = cards.subList(0, 1)
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
→ **카드 N장 공개 = 비즈니스 로직 + 추상 메서드 다형성** = PR #129·#126·#142 결 합류.
|
|
420
|
+
|
|
421
|
+
### 17. `dealerMatchProfit(dealer: Dealer)` Player 만 호출 + 결과 부호 반전 — `Dealer.allPlayersMatchProfit` 호출
|
|
422
|
+
|
|
423
|
+
```kotlin
|
|
424
|
+
fun allPlayersMatchProfit(players: Collection<Player>): Profit {
|
|
425
|
+
val playersProfitSum = players.sumOf { player -> player.dealerMatchProfit(this).value }
|
|
426
|
+
return Profit(-playersProfitSum + 0.0)
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
→ **Dealer 자가 결과 = -Players 합** = PR #36 (`operator fun not()`), PR #35 (`* -1`), PR #142 (`Scoreboard.dealerProfit`) 결 합류. **부호 반전 정공**.
|
|
431
|
+
|
|
432
|
+
### 18. `winLoss` 메서드 Player 호출 / Dealer 미사용 — 비대칭
|
|
433
|
+
|
|
434
|
+
```kotlin
|
|
435
|
+
// GameParticipant
|
|
436
|
+
protected fun winLoss(rival: GameParticipant): WinLoss = handCards.versusRivalWinLoss(...)
|
|
437
|
+
|
|
438
|
+
// Player.dealerMatchProfit
|
|
439
|
+
val profitRate = ProfitRate.calculateProfitRate(this.winLoss(dealer), this.cardStatus)
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
→ **Player.winLoss(dealer) 호출만** + **Dealer.allPlayersMatchProfit = Players 합 부호 반전** = *Dealer 자가 winLoss 호출 X*. **비대칭** = *학생의 *플레이어 결과 = 딜러 결과 부호 반전* 의도 일관*.
|
|
443
|
+
|
|
444
|
+
다만 **PR #142 (양쪽 자가 비교 정공 = `compareAgainst`) 와 반대 시점 (Player 만 자가 비교)** = *Tell-Don't-Ask 부분 위반*.
|
|
445
|
+
|
|
446
|
+
PR #87·#129·#142 결의 *대칭 자가 비교 정공* vs PR #143 (비대칭 = 부호 반전) 트레이드오프.
|
|
447
|
+
|
|
448
|
+
**MCP 룰 `symmetric-compare-bidirectional-call` 강화** 누적 2+ PR (#142·#143). *반대 시점 트레이드오프*.
|
|
449
|
+
|
|
450
|
+
### 19. `Profit(-playersProfitSum + 0.0)` `+ 0.0` 더하기 — `-0.0` 회피
|
|
451
|
+
|
|
452
|
+
§6 참조.
|
|
453
|
+
|
|
454
|
+
### 20. `versusRivalWinLoss(rival.cardStatus, rival.bestValue)` HandCards 메서드 — 외부 cardStatus + bestValue 인자
|
|
455
|
+
|
|
456
|
+
```kotlin
|
|
457
|
+
// GameParticipant
|
|
458
|
+
protected fun winLoss(rival: GameParticipant): WinLoss = handCards.versusRivalWinLoss(rival.cardStatus, rival.bestValue)
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
→ **HandCards 가 *rival.cardStatus + rival.bestValue* 2 외부 인자 받음** = *PR #142 (lambda-multiple-args-tuple-leak) 결과 같은 *Tuple 누수 변형***.
|
|
462
|
+
|
|
463
|
+
대안: **`handCards.versusRivalWinLoss(rival.handCards)`** 또는 **`HandCards.compareAgainst(other: HandCards)`** — *HandCards ↔ HandCards 직접 비교*. **MCP 룰 `parameter-explosion-vs-object-passing` 후보**.
|
|
464
|
+
|
|
465
|
+
### 21. 학생 자가 *isDrawFinish 활용* 의식
|
|
466
|
+
|
|
467
|
+
reviewer (Thread 13): *"Player의 `isDrawFinish()` 를 활용해볼 수 있을까요?"*
|
|
468
|
+
|
|
469
|
+
학생:
|
|
470
|
+
|
|
471
|
+
> *"스스로 만들어놓고 정작 까먹고 안쓰는게 많은 것 같네요... 고치도록 노력해봐야겠습니다."*
|
|
472
|
+
|
|
473
|
+
→ **자가 추상화 활용 부족 자가 인지** = *추상화 활용 점검 어휘 (PR #129·#138·#142)* 합류.
|
|
474
|
+
|
|
475
|
+
### 22. `Player.isDrawFinish = this.cardStatus == CardStatus.BUST` — 21 시 hit 가능
|
|
476
|
+
|
|
477
|
+
```kotlin
|
|
478
|
+
override val isDrawFinish: Boolean
|
|
479
|
+
get() = this.cardStatus == CardStatus.BUST
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
→ **Player BUST 시 종료 = 21 시 hit 가능 (`<=` 21)**. PR #129·#138·#139·#126 결과 동일. PR #35 (21 시 stop) 반대 시점.
|
|
483
|
+
|
|
484
|
+
### 23. `Dealer.DEALER_DRAW_LIMIT = 16` + `<= 16` 정공
|
|
485
|
+
|
|
486
|
+
```kotlin
|
|
487
|
+
override val isDrawFinish: Boolean
|
|
488
|
+
get() = handCards.bestCardValue <= DEALER_DRAW_LIMIT
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
→ **Dealer 16 시 stop 시점 = `<= 16`** = **블랙잭 룰 와전 가능 (PR #129 와 같음)**:
|
|
492
|
+
|
|
493
|
+
- *블랙잭 표준 = Dealer 16 이하 hit / 17 이상 stop*.
|
|
494
|
+
- *학생 코드 `<= 16 → isDrawFinish = true (종료)`* = *16 시 hit X = 와전*.
|
|
495
|
+
|
|
496
|
+
대안: *`< 17` (PR #35 정공)* 또는 *`> 16` (16 시 hit, 17 시 stop)*.
|
|
497
|
+
|
|
498
|
+
**MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 17+ PR ⭐⭐⭐. *학생 자가 룰 와전 = 17 미만 hit vs 17 이상 stop 양가성*.
|
|
499
|
+
|
|
500
|
+
PR #126 (`HIT_THRESHOLD = 16` + `<= 16` hit), PR #138 (`DEALER_MAX_SCORE = 16` + `<= 16` hit) 의 *정공* 반대 시점.
|
|
501
|
+
|
|
502
|
+
### 24. `cardSize: Int` private 멤버 — 외부 노출 X
|
|
503
|
+
|
|
504
|
+
```kotlin
|
|
505
|
+
private val cardSize: Int get() = handCards.cards.size
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
→ **`private val cardSize` 외부 노출 X** + **`val isInitHandCard: Boolean get() = cardSize == HandCards.INIT_CARD_SIZE`** = 외부 호출자는 *isInitHandCard 만 알면 됨* = *캡슐화 정공*.
|
|
509
|
+
|
|
510
|
+
reviewer (Thread 3): *"GameParticipant에 이미 만들어두었던 함수를 활용해볼 수 있을 것 같아요!"*
|
|
511
|
+
|
|
512
|
+
학생: *"`participant.cardSize() < INIT_CARD_SIZE`룰 `participant.isInitHandCard()` 로 바꿀 수 있겠네요...!"*
|
|
513
|
+
|
|
514
|
+
→ **자가 추상화 활용 부족 자가 인지** (§21 결).
|
|
515
|
+
|
|
516
|
+
### 25. ProfitStatistics 의 로직 분리 — 모델 자가 처리
|
|
517
|
+
|
|
518
|
+
reviewer (Thread 7): *"ProfitStatistics의 로직들을 분리해서, 각 모델들이 일하게끔 만들 수 있겠다는 생각이 듭니다. 한번 고민해볼까요? 🤔"*
|
|
519
|
+
|
|
520
|
+
학생: *"`ProfitStatistics`를 만들면서 딜러와 플레이어가 직접 수익이 얼마인지를 알려줄 수 있으면 좋을 것 같다고 생각했는데 구현을 고민해봐야겠습니다"*
|
|
521
|
+
|
|
522
|
+
→ **god-object 회피 + 모델 자가 일** = *Player.dealerMatchProfit / Dealer.allPlayersMatchProfit* 자가 적용. PR #142 (Scoreboard) 결의 *반대 시점 (Scoreboard 통합 vs Player/Dealer 분산)*.
|
|
523
|
+
|
|
524
|
+
## 리뷰어 의견 요지
|
|
525
|
+
|
|
526
|
+
- **Deck 컨트롤러 외부 주입 vs 내부 생성** — *DI 트레이드오프*.
|
|
527
|
+
- **player.addCard vs deck.draw 직접 (1단계 자가 의문 자가 진화)**.
|
|
528
|
+
- **GameParticipant 기존 함수 활용 (isInitHandCard)** — *자가 추상화 활용 부족*.
|
|
529
|
+
- **PlayerTest 사라짐 + participant 테스트 추가**.
|
|
530
|
+
- **`-0` 방지 + `0.0f` 더하기** — *Float IEEE 754 함정 자가 학습*.
|
|
531
|
+
- **상수화 (BetAmount 최소)** — *카지노 설정*.
|
|
532
|
+
- **ProfitStatistics 로직 분리 → 모델 자가 처리**.
|
|
533
|
+
- **1.5/1.0 배 = 한 클래스 묶음 (ProfitRate enum)**.
|
|
534
|
+
- **카드 이니셜 = 비즈니스 vs View 양가 (학생 자가 본질 어휘)**.
|
|
535
|
+
- **WinLossStatistics 추상화 (모델 자가 일)**.
|
|
536
|
+
- **딜러 첫 턴 한 장 = 비즈니스 vs View → 추상 메서드 정공**.
|
|
537
|
+
- **MutableList 외부 참조 위험 + 방어적 복사 자가 학습**.
|
|
538
|
+
- **Player.isDrawFinish 활용 부족 자가 인지**.
|
|
539
|
+
- **Kotlin 클래스 순서 컨벤션**.
|
|
540
|
+
- **`participantInfo` 인공 객체 → Dealer BetAmount X 권유 + 학생 자가 *원래 그리던 꿈을 펼쳐볼까***.
|
|
541
|
+
- **custom get vs function 학생 자가 4 분류**.
|
|
542
|
+
- **HandCards 승패 판단 + BetAmount.profit 리턴 + Dealer 합산**.
|
|
543
|
+
- **BetAmount 기본값 1 vs Dealer 가 BetAmount X**.
|
|
544
|
+
|
|
545
|
+
## 대표 인용
|
|
546
|
+
|
|
547
|
+
> [medAndro PR 본문]
|
|
548
|
+
> *"Step2를 일단 기능을 빠르게 구현 완료하긴 했는데 의식의 흐름대로 짜서 이게 맞나 싶기도 한 코드가 된 것 같네요"*
|
|
549
|
+
|
|
550
|
+
→ **학생 자가 *의식의 흐름 코드* 인정** = PR #139 (parkjiminnnn *진흙탕 코드*) 결 합류.
|
|
551
|
+
|
|
552
|
+
> [medAndro PR 본문]
|
|
553
|
+
> *"`ProfitStatistics`에서 일단 getter를 써서 구현해 보았는데 언제 함수를 쓰고 언제 getter를 쓰는지는 슬랙의 페토의 글을 보고 주말에 공부좀 해봐야 될 것 같습니다."*
|
|
554
|
+
|
|
555
|
+
→ **슬랙 외부 자료 자가 학습**. *Kotlin 어휘 자가 학습 정점*.
|
|
556
|
+
|
|
557
|
+
> [medAndro Thread 5]
|
|
558
|
+
> *"코틀린에서 float는 `-0.0f`와 `0.0f`를 구분한다는 것을 알게 되었습니다. 조건문을 걸어서 해결하는 방법도 있지만 `0.0f`를 더하는게 가장 간편한 해결책인것 같아서 추가하게 되었습니다."*
|
|
559
|
+
|
|
560
|
+
→ **Float IEEE 754 자가 학습 + 해결책 비교** — *깊은 자가 학습*. PR #131 결 재발견.
|
|
561
|
+
|
|
562
|
+
> [medAndro Thread 15]
|
|
563
|
+
> *"둘리 외에 어떤 공룡 리뷰어가 `요구사항을 지켜야 하지만 좋은 설계라고 생각하면 가끔은 깨부셔도..?` 라며 원래 그리던 꿈을 펼쳐보라는 리뷰를 다시는 것을 보았는데 저도 원래 그리던 꿈을 펼쳐볼까 합니다."*
|
|
564
|
+
|
|
565
|
+
→ **다른 reviewer 어휘 cross-reference + 학생 자가 형식 규칙 비판** — *PR #138 결 강화 + 새로운 cross-reference 패턴*.
|
|
566
|
+
|
|
567
|
+
> [medAndro Thread 16]
|
|
568
|
+
> *"커스텀 get() 프로퍼티 - 클라이언트가 해당 값을 객체의 속성처럼 생각할 것 같을 경우 - 단순한 객체의 상태를 받아 올 경우. 함수 - 값을 가져오기 위해 파라미터가 필요한 경우 - 값을 가져오는것이 아닌 객체를 변화시키는 조정자로 쓰일 경우 로 정리했습니다."*
|
|
569
|
+
|
|
570
|
+
→ **Kotlin 어휘 자가 4 분류 (property vs function)** — *학생 자가 학습 정점*.
|
|
571
|
+
|
|
572
|
+
> [medAndro Thread 13]
|
|
573
|
+
> *"스스로 만들어놓고 정작 까먹고 안쓰는게 많은 것 같네요... 고치도록 노력해봐야겠습니다."*
|
|
574
|
+
|
|
575
|
+
→ **자가 추상화 활용 부족 자가 인지 (자가 비판 어휘)**.
|
|
576
|
+
|
|
577
|
+
## 얻은 교훈 (보편)
|
|
578
|
+
|
|
579
|
+
1. **PR 본문 자가 *의식의 흐름 코드* 인정 + 외부 자료 + 오프라인 만남** — *학습 적극성 정점*.
|
|
580
|
+
|
|
581
|
+
2. **`-0.0` Float IEEE 754 함정 자가 학습 + 해결책 비교** — **MCP 룰 `negative-zero-floating-point-trap` 강화** 누적 2+ PR (#131·#143).
|
|
582
|
+
|
|
583
|
+
3. **3 인스턴스 변수 제약 학생 자가 비판 + 다른 reviewer 어휘 cross-reference (*원래 그리던 꿈을 펼쳐볼까*)** — **MCP 룰 `form-rule-artificial-grouping-self-critique` 강화** 누적 2+ PR (#138·#143). **MCP 룰 `peer-reviewer-cross-reference` 후보**.
|
|
584
|
+
|
|
585
|
+
4. **custom get vs function 학생 자가 4 분류** — *property (속성/상태) vs function (파라미터/조정자)*. **MCP 룰 `property-vs-function-criteria` 후보**.
|
|
586
|
+
|
|
587
|
+
5. **WinLoss + ProfitRate enum 분리 (결과 vs 수익률)** — **MCP 룰 `result-vs-rate-enum-separation` 후보**. PR #142 (단일 GameResult) 반대 시점.
|
|
588
|
+
|
|
589
|
+
6. **DI vs 내부 생성 (Deck)** — *유연성 vs 호출자 간결*. **MCP 룰 `dependency-injection-vs-internal-creation` 후보**.
|
|
590
|
+
|
|
591
|
+
7. **Dealer 가 BetAmount X (반대 시점 1)** — *PR #87 (Dummy zero) 정공*. **MCP 룰 `dummy-zero-for-domain-absent` 강화** 누적 2+ PR.
|
|
592
|
+
|
|
593
|
+
8. **블랙잭 1.5배 모델 (총 받음 1.5)** — *PR #36·#87·#138 결과 일치*. PR #35·#142 (순수익 0.5 모델) 와 반대 시점.
|
|
594
|
+
|
|
595
|
+
9. **HandCards 외부 참조 위험 + 방어적 복사 자가 학습** — PR #21·#117·#138 결.
|
|
596
|
+
|
|
597
|
+
10. **자가 추상화 활용 부족 자가 인지 (isDrawFinish 미사용)** — *학생 자가 비판*. **MCP 룰 `student-self-abstraction-underuse` 후보**.
|
|
598
|
+
|
|
599
|
+
11. **양쪽 자가 비교 vs 부호 반전 (PR #142 양방 vs PR #143 부호 반전)** — *symmetric-compare 트레이드오프*. **MCP 룰 `symmetric-compare-bidirectional-call` 강화** 누적 2+ PR.
|
|
600
|
+
|
|
601
|
+
12. **enum static vs instance method locator (ProfitRate.calculateProfitRate)** — **MCP 룰 후보**.
|
|
602
|
+
|
|
603
|
+
13. **블랙잭 룰 와전 (`<= 16` = 16 시 stop, 룰 = 16 시 hit)** — **MCP 룰 `blackjack-rule-fidelity-comparison` 강화** 누적 17+ PR ⭐⭐⭐.
|
|
604
|
+
|
|
605
|
+
14. **외부 컬렉션 인자 vs 멤버 (Dealer.allPlayersMatchProfit(players))** — **MCP 룰 `external-collection-as-method-arg-vs-member` 후보**.
|
|
606
|
+
|
|
607
|
+
15. **테스트 회귀 (Deck object 제거 부작용)** — **MCP 룰 `test-regression-from-deck-refactor` 후보**.
|
|
608
|
+
|
|
609
|
+
16. **카드 이니셜 = 표시 vs 본질 트레이드오프** — **MCP 룰 `view-format-as-domain-invariant-tradeoff` 후보**.
|
|
610
|
+
|
|
611
|
+
17. **영어 어순 어색 (`cardAdd`, `fromDeckCardDraw`)** — **MCP 룰 `english-word-order-naming` 강화** 누적 2+ PR.
|
|
612
|
+
|
|
613
|
+
18. **computed property 매 호출 재계산 비용** — **MCP 룰 `computed-property-vs-val-recompute-cost` 후보**.
|
|
614
|
+
|
|
615
|
+
19. **HandCards 캡슐화 학생 자가 의문 (Thread 17)** — *Tell-Don't-Ask 캡슐화 양가*.
|
|
616
|
+
|
|
617
|
+
20. **모든 19 스레드 학생 자가 답변 + 학생 자가 4-5 분류 + 학생 자가 한계 인지 + 외부 자료** — *2025 코호트 정점 유지*.
|
|
618
|
+
|
|
619
|
+
## 얻은 교훈 (도메인)
|
|
620
|
+
|
|
621
|
+
1. **블랙잭 1.5배 (총 받음) 모델** — `BLACKJACK_WIN(1.5)`. PR #36·#87·#138 정공.
|
|
622
|
+
|
|
623
|
+
2. **딜러 hit 한계 16 = `<= 16` 종료** — *룰 와전 가능 (16 시 stop)*. PR #129 결과 같은 와전.
|
|
624
|
+
|
|
625
|
+
3. **카드 이니셜 = 도메인 본질 (학생 자가 어휘)** — *변경 가능성 X = Model OK*.
|
|
626
|
+
|
|
627
|
+
4. **`-0.0` Float 함정** — *블랙잭 도메인 X, Kotlin 어휘*.
|
|
628
|
+
|
|
629
|
+
5. **Dealer 가 BetAmount 멤버 X (반대 시점 1)** — *Player 만 betAmount*. PR #87 Dummy zero 정공.
|
|
630
|
+
|
|
631
|
+
6. **WinLoss + ProfitRate enum 분리** — *블랙잭 결과 (3 종) + 수익률 (4 종) 분리*.
|
|
632
|
+
|
|
633
|
+
7. **Dealer 수익 = -Players 합** — PR #36·#87·#142·#143 결.
|
|
634
|
+
|
|
635
|
+
## MCP 룰 후보 신규 + 강화 (PR #143)
|
|
636
|
+
|
|
637
|
+
| 룰 | 신규 / 강화 | 누적 PR |
|
|
638
|
+
|---|---|---|
|
|
639
|
+
| `negative-zero-floating-point-trap` | 강화 | 2+ (#131·#143) |
|
|
640
|
+
| `form-rule-artificial-grouping-self-critique` | 강화 | 2+ (#138·#143) |
|
|
641
|
+
| `peer-reviewer-cross-reference` | 신규 | 1 (#143) |
|
|
642
|
+
| `property-vs-function-criteria` | 신규 | 1 (#143) |
|
|
643
|
+
| `result-vs-rate-enum-separation` | 신규 | 1 (#143) |
|
|
644
|
+
| `dependency-injection-vs-internal-creation` | 신규 | 1 (#143) |
|
|
645
|
+
| `dummy-zero-for-domain-absent` | 강화 | 2+ (#87·#143) |
|
|
646
|
+
| `symmetric-compare-bidirectional-call` | 강화 | 2+ (#142·#143) |
|
|
647
|
+
| `enum-static-vs-instance-method-locator` | 신규 | 1 (#143) |
|
|
648
|
+
| `blackjack-rule-fidelity-comparison` | 강화 | 17+ ⭐⭐⭐ |
|
|
649
|
+
| `external-collection-as-method-arg-vs-member` | 신규 | 1 (#143) |
|
|
650
|
+
| `test-regression-from-deck-refactor` | 신규 | 1 (#143) |
|
|
651
|
+
| `view-format-as-domain-invariant-tradeoff` | 신규 | 1 (#143) |
|
|
652
|
+
| `english-word-order-naming` | 강화 | 2+ (#143·#87) |
|
|
653
|
+
| `computed-property-vs-val-recompute-cost` | 신규 | 1 (#143) |
|
|
654
|
+
| `student-self-abstraction-underuse` | 신규 | 1 (#143) |
|
|
655
|
+
| `parameter-explosion-vs-object-passing` | 신규 | 1 (#143) |
|
|
656
|
+
| `domain-rule-arbitrary-constant` | 강화 | 4+ |
|
|
657
|
+
| `dsl-applicability-criteria` | (제거 추천) | (PR #35 결만) |
|
|
658
|
+
|
|
659
|
+
## 메타 어휘 (14 reviewer + MCP 핵심 가치 합류 정점 유지)
|
|
660
|
+
|
|
661
|
+
- ***학생 자가 *의식의 흐름 코드* 인정 + 외부 자료 + 오프라인 만남*** — medAndro PR #143 — *학습 적극성 정점*.
|
|
662
|
+
- ***`-0.0` Float IEEE 754 자가 학습 + 해결책 비교*** — medAndro PR #143 — *Kotlin/Java 어휘 깊은 자가 학습*. PR #131 결 재발견.
|
|
663
|
+
- ***다른 reviewer 어휘 cross-reference + 형식 규칙 자가 비판*** — medAndro PR #143 — *"둘리 외에 어떤 공룡 리뷰어가 ... 원래 그리던 꿈을 펼쳐보라는 리뷰를 다시는 것을 보았는데 저도 원래 그리던 꿈을 펼쳐볼까 합니다."*. **MCP 핵심 가치 합류 + 새로운 cross-reference 패턴**.
|
|
664
|
+
- ***Kotlin 어휘 자가 4 분류 (property vs function)*** — medAndro PR #143 — *학생 자가 학습 정점*.
|
|
665
|
+
- ***자가 추상화 활용 부족 자가 인지*** — medAndro PR #143 — *"스스로 만들어놓고 정작 까먹고 안쓰는게 많은 것 같네요..."*.
|
|
666
|
+
|
|
667
|
+
→ **14 reviewer + MCP 핵심 가치 어휘 합류 정점 유지**. **batch 21 신규 발견 = *학생이 다른 reviewer 어휘 cross-reference (peer-reviewer-cross-reference)* + *학생 자가 Kotlin 어휘 N 분류*** = *학습 가시화 정점 + 학생 ↔ 다른 reviewer 어휘 합류*.
|
|
668
|
+
|
|
669
|
+
## 비교 (PR #130 → #143 진화 — 사족 X, 안티패턴 명시만)
|
|
670
|
+
|
|
671
|
+
- **1단계 #130 25 thread → 2단계 #143 19 thread** — *깊이 유지*.
|
|
672
|
+
- **1단계 #130 PR 본문 자가 한계 4 종 → 2단계 #143 PR 본문 자가 *의식의 흐름 코드* + 슬랙 외부 자료 + 오프라인 만남** — *학생 자가 학습 정점 진화*.
|
|
673
|
+
- **1단계 #130 Singleton Deck 자가 인지 → 2단계 #143 Deck DI + Player.fromDeckCardDraw 자가 적용** — *학습 시간성 정공*.
|
|
674
|
+
- **1단계 #130 `Number` 클래스 명명 충돌 → 2단계 #143 유지 (자가 비판 + 시간 부족)** — *학습 시간성 부분 한계*.
|
|
675
|
+
- **1단계 #130 outputView 함수 한번만 호출 학생/reviewer 자가 한계 → 2단계 #143 `versusRivalWinLoss` 외부 cardStatus/bestValue 인자 (Tuple 누수 변형)** — *Tell-Don't-Ask 진화 + 부분 위반*.
|
|
676
|
+
- **1단계 #130 학생 자가 한계 4 종 → 2단계 #143 학생 자가 추상화 활용 부족 자가 인지** — *자가 비판 깊이 진화*.
|
|
677
|
+
|
|
678
|
+
→ *진화 비교 = 사족 아님* + *학생 자가 학습 정점 진화 + 형식 규칙 자가 비판 + 다른 reviewer 어휘 cross-reference 신규 패턴*.
|