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,188 @@
|
|
|
1
|
+
# PR #103 — [블랙잭 2단계] 해나 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@hxeyexn](https://github.com/hxeyexn)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/103
|
|
5
|
+
- **단계:** 2단계 (베팅 / 수익률 / 블랙잭 1.5배)
|
|
6
|
+
- **리뷰어:** @laco-dev (페로로)
|
|
7
|
+
- **라인 코멘트:** 10 스레드 / 20 코멘트 — 짧은 PR + 핵심 안티패턴 진단 다수
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **플레이어 + 베팅 금액 동시 입력 자가 반영** — 페로로의 *"플레이어를 준비하면서 배팅 금액을 입력받을 수 있지 않을까요?"* 진단 자가 반영 (커밋 `14775ee`). PR #85·#88·#90 와 같은 결.
|
|
12
|
+
- **딜러 16점 룰 명시 자가 반영** — 페로로의 *"딜러도 16점 이하라면, 16점을 넘을 때 까지 계속해서 뽑아야 합니다."* 진단 자가 반영 (커밋 `55d2dcf`). 1단계 룰 보강.
|
|
13
|
+
- **딜러 베팅 금액 제거 자가 반영** — 페로로의 *"배팅 금액은 플레이어에게만 있는 개념이 아닐까요? 딜러의 입장에서는, 배팅을 하지 않으니까요"* 진단 자가 반영 (커밋 `a69ea03`). *Dealer ≠ Player 도메인 구분 명시*. PR #103 (해나) 의 *Player(name, betAmount) vs Dealer(name)* 비대칭 정공. PR #133·#85·#136 와 같은 결.
|
|
14
|
+
- **수익률 계산 책임 = `FinalWinning`** 자가 결정 — 페로로 메타 질문 *"수익률은, 게임 결과인 FinalWinning이 계산하는 것과 Participants가 계산하는 것 중 누가 하는 것이 적절하다고 생각하시나요?"* 에 학생 자가 답변: *"FinalWinning이 좀 더 적절한 것 같습니다! Participants와 FinalWinning 중 고민 했었는 데 FinalWinning으로 수익률을 계산하는 것을 옮겨보니 코드가 간결해졌다는 걸 느꼈습니다."* (커밋 `2253b73`). **자가 결정 + 근거 명시 모범**.
|
|
15
|
+
- **상태 패턴 도입 자가 학습 (CardHand 분리)** — 페로로의 *"플레이어는 스테이 상태를 선언하면, 카드를 더 이상 뽑을 수 없어요. 이 개념을 구현 해보시면 좋을 것 같습니다."* + 1단계 코멘트 인용 *"플레이어와 딜러가 카드 상태랑 강하게 결합되어 있다 ... 플레이어가 스테이가 될 수 있다는 상태가 고려한다면 도움이 좀 될 것 같습니다."* 후속 반영 (커밋 `e0f3ef7`). *학생 자가 인용으로 1단계 진단 의식 명시*.
|
|
16
|
+
- **Bust 양측 처리 + 딜러 Bust 룰 자가 반영** — 페로로의 *"내가 버스트라면 상대의 패와 상관없이 무조건 패배합니다."* 진단 학생 자가 정리: *"- 플레이어가 Bust라면 딜러의 패와 상관없이 무조건 패. - 딜러가 Bust이고, 플레이어가 Bust가 아니라면 딜러 패"* 룰 추가 (커밋 `68dd994`). **블랙잭 룰 정확성 자가 학습 모범**. PR #128·#135·#114·#136 와 같은 결.
|
|
17
|
+
- **`calculatePlayerProfit` MutableMap 인자 제거 자가 반영** — 페로로 진단 *"메서드를 분리하는 과정에서 놓친 것 같습니다. profit 파라미터 삭제하였습니다!"* (커밋 `4503d84`). *불필요한 가변 인자 제거*.
|
|
18
|
+
- **`CardFixture` 활용 + 꼼꼼한 테스트** — 페로로 자가 칭찬 다수 (Fixture 좋습니다 + 꼼꼼한 테스트 좋았습니다).
|
|
19
|
+
|
|
20
|
+
## 못한 점 (설계 관점)
|
|
21
|
+
|
|
22
|
+
### 1. `RandomDeck` 의 `_cardDeck` + `cardDeck` 이중 표현 — *불필요한 중복*
|
|
23
|
+
|
|
24
|
+
학생 코드 (추정):
|
|
25
|
+
```kotlin
|
|
26
|
+
class RandomDeck {
|
|
27
|
+
private val _cardDeck: List<Card> = ...
|
|
28
|
+
private val cardDeck: List<Card> = ...
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
페로로 (RandomDeck.kt:6 — 미해결): *"이 두개의 카드덱은 어떤 차이가 있나요?"*
|
|
33
|
+
|
|
34
|
+
학생: *"_cardDeck에는 실제 카드 덱을 저장하고, cardDeck을 이용해 클래스 외부에서는 카드 덱 데이터를 읽을 수는 있지만, 직접 수정할 수는 없게 하려고 했었습니다. 리팩터링 하다보니 cardDeck을 외부에서 사용할 때가 없어졌는 데 추후에 사용할 일이 있을까봐 일단은 private으로 설정해뒀습니다! 혹시 제가 잘못 이해하고 있는 부분이 있을까요..?"*
|
|
35
|
+
|
|
36
|
+
페로로 후속: *"둘 다 모두 `List<Card>` 타입이고, 따로 두개가 나뉘어진 이유가 모르겠네요!?"*
|
|
37
|
+
|
|
38
|
+
→ **`_cardDeck` (private) + `cardDeck` (private) 이중 표현 = *불필요한 중복***. *Kotlin backing field 패턴 = `private val _x + val x: get() = _x.toList()`*. *둘 다 `List<Card>`* 면 *backing field 아닌 단순 중복*. *YAGNI 위반*. PR #88 (채드) 의 *부 생성자 미사용 자가 삭제* 와 같은 결.
|
|
39
|
+
|
|
40
|
+
학생 자가 답변에서 *"추후에 사용할 일이 있을까봐 일단은 private으로 설정해뒀습니다"* = **추측 코딩 신호** — *현재 사용처에서 시작 + 필요 시 추가* 정공.
|
|
41
|
+
|
|
42
|
+
### 2. `CardHand` *카드 + 상태 결합 강도* — 1단계 진단의 일부 후속 반영
|
|
43
|
+
|
|
44
|
+
페로로 (CardHand.kt:31 — 미해결): *"플레이어는 스테이 상태를 선언하면, 카드를 더 이상 뽑을 수 없어요. 이 개념을 구현 해보시면 좋을 것 같습니다."*
|
|
45
|
+
|
|
46
|
+
학생 자가 답변: *"> 지난번 플레이어와 딜러가 카드 상태랑 강하게 결합되어 있다는 말을 드렸는데, > 플레이어가 스테이가 될 수 있다는 상태가 고려한다면 도움이 좀 될 것 같습니다. 이와 관련해 step1에서 남겨 주신 조언 참고해서 피드백 반영해보았습니다!"* (커밋 `e0f3ef7`).
|
|
47
|
+
|
|
48
|
+
→ **1단계 진단 인용 = 학습 모범**. *학생이 1단계 페로로 코멘트 직접 인용 + 의식적 반영*. PR #128·#135·#108·#133·#136 와 같은 결의 *진단 인식 + 후속 반영*.
|
|
49
|
+
|
|
50
|
+
다만 *상태 분리 결과 코드는 미공개* — *Hand 자체에 stay boolean / sealed state / enum* 등 표현 방식이 *PR #85·#136·#152·#133·#131* 의 다양한 트레이드오프 중 어느 것인지 확인 불가.
|
|
51
|
+
|
|
52
|
+
### 3. `Participants.calculatePlayerProfit(MutableMap)` 인자 — *부수효과 메서드 시그니처*
|
|
53
|
+
|
|
54
|
+
페로로 (Participants.kt — 미해결): *"calculatePlayerProfit() 라는 함수 이름으로만 보면, 수익률을 반환하는 역할을 잘 수행하고 있어요. 그런데 MutableMap을 굳이 파라미터로 넣어줄 필요가 있는 것일까요?"*
|
|
55
|
+
|
|
56
|
+
학생 자가 답변 (커밋 `4503d84`): *"메서드를 분리하는 과정에서 놓친 것 같습니다. profit 파라미터 삭제하였습니다!"*
|
|
57
|
+
|
|
58
|
+
→ **MutableMap 인자 = 부수효과 메서드 시그니처**. *calculateXXX 가 반환 + 외부 가변 Map 변경* 동시 책임. *PR #85 (하디 2단계) 의 페로로 calculateFinalProfits Unit 반환 진단* 과 같은 결. *학생 자가 후퇴 모범*.
|
|
59
|
+
|
|
60
|
+
### 4. *`is Bust` 의 *상대 패와 무관하게 패배* 룰 누락 (자가 수정 전)*
|
|
61
|
+
|
|
62
|
+
페로로 (Role.kt — 미해결, 자가 반영 후): *"내가 버스트라면 상대의 패와 상관없이 무조건 패배합니다."*
|
|
63
|
+
|
|
64
|
+
학생 자가 정리:
|
|
65
|
+
```
|
|
66
|
+
- 플레이어가 Bust라면 딜러의 패와 상관없이 무조건 패
|
|
67
|
+
- 딜러가 Bust이고, 플레이어가 Bust가 아니라면 딜러 패
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
(커밋 `68dd994`).
|
|
71
|
+
|
|
72
|
+
→ **블랙잭 룰 정확성 = Bust 우선순위 + 비대칭**. *플레이어 Bust → 무조건 Lose*, *딜러 Bust + 플레이어 비Bust → 플레이어 Win*. *양측 Bust → 플레이어 Lose (카지노 룰)*. PR #128·#135·#114·#125·#108·#133·#132·#136 와 같은 결.
|
|
73
|
+
|
|
74
|
+
### 5. `Fixture` 직접 활용 미숙 — 학생 자가 질문
|
|
75
|
+
|
|
76
|
+
페로로 (RoleTest.kt:159 — 미해결): *"꼼꼼한 테스트 좋았습니다. Fixture를 조금 더 활용한다면, 이렇게도 생성해 볼 수 있어요. `val dealer = Dealer(HEART_TEN, HERART_SEVEN); val player = Player(HEART_TEN, HEART_FIVE)`"*
|
|
77
|
+
|
|
78
|
+
학생 답변: *"감사합니다! 위 예시가 아직 잘 이해가 되지 않는 데 혹시 조언이나 자료를 좀 더 얻을 수 있을까요..? 🥲"*
|
|
79
|
+
|
|
80
|
+
→ **Fixture = 생성자 인자 가변 + 매 테스트 다른 카드 조합**. *Dealer(card1, card2)* 같은 *생성자 카드 인자*가 *vararg 또는 List 인자*로 *유연한 테스트 데이터*. *현재 학생은 fixture 의미 학습 진행 중*. PR #90·#133·#136 의 *Fixture 활용 패턴* 과 비교: PR #103 은 *학습 진행 중*.
|
|
81
|
+
|
|
82
|
+
### 6. `BlackJack` controller 가 *플레이어 준비 + 게임 진행* 책임 — *분리 부재 신호*
|
|
83
|
+
|
|
84
|
+
페로로 (BlackJack.kt — 첫 두 코멘트): *플레이어 준비 + 배팅 금액 입력 + 16점 룰* 모두 *Controller 의 직접 책임*. *Game 도메인 객체 분리 부재*. PR #131·#132·#136·#152 와 같은 결의 *Controller god-object* 변형.
|
|
85
|
+
|
|
86
|
+
학생 후속 반영으로 *플레이어 + 베팅 동시 입력*은 *생성 시점 응집*. 다만 *게임 진행 (딜러 16점 룰) 가 Controller 안*인지 *Dealer/Game 객체 안*인지 *코드 미공개*.
|
|
87
|
+
|
|
88
|
+
### 7. `RandomDeck` *naming* — *deck = 셔플 결과 vs 셔플 방식*
|
|
89
|
+
|
|
90
|
+
→ **`RandomDeck` = *셔플된 덱 = 랜덤 카드 시퀀스***. *덱 = 카드 모음 + 셔플 = 랜덤 순서* 라면 *Deck 만으로 충분*. *RandomDeck* 이 *고정 순서 Deck* 와 *대비 표현* 의도라면 *전략 패턴 (ShuffleStrategy)* 이 정공. PR #108·#133·#136·#93 의 *ShuffleStrategy / DeckManager interface* 와 같은 결.
|
|
91
|
+
|
|
92
|
+
### 8. *수익률 계산 책임의 두 후보 (Participants vs FinalWinning) 자가 결정 — 근거 명시*
|
|
93
|
+
|
|
94
|
+
페로로 메타 질문 → 학생 자가 결정 + 근거: *"FinalWinning으로 수익률을 계산하는 것을 옮겨보니 코드가 간결해졌다는 걸 느꼈습니다."*
|
|
95
|
+
|
|
96
|
+
→ **결정 근거 = "코드 간결성"**. *PR #131·#132·#108·#133·#85 의 *수익률 책임 위치 토론* 과 같은 결*. 다양한 선택지 (Participant 자기 책임 vs Result 객체 응집)*. *해나 = FinalWinning 응집* 선택. PR #85 (하디) 의 *PlayerResult.profit by lazy* 와 같은 결.
|
|
97
|
+
|
|
98
|
+
### 9. `BlackJack.kt:112` — Controller 직접 딜러 룰 보유
|
|
99
|
+
|
|
100
|
+
페로로 (BlackJack.kt:112 — 미해결): *"딜러도 16점 이하라면, 16점을 넘을 때 까지 계속해서 뽑아야 합니다."*
|
|
101
|
+
|
|
102
|
+
학생 후속 반영: *16점 룰 추가*.
|
|
103
|
+
|
|
104
|
+
→ **딜러 룰 = Dealer 자기 책임 vs Controller 명령** — *Dealer.shouldDrawCard() = score <= 16* 메시지가 자연. PR #131·#132·#136 와 같은 결. *현재 코드 미공개* — *룰 위치 정확 확인 불가*.
|
|
105
|
+
|
|
106
|
+
## 리뷰어 의견 요지
|
|
107
|
+
|
|
108
|
+
- **플레이어 준비 + 베팅 금액 동시 입력** — *생성 시점에 모든 정보 응집*.
|
|
109
|
+
- **딜러 = 베팅 안 함, 도메인 구분** — *Player ≠ Dealer 의 멤버 차이*.
|
|
110
|
+
- **딜러 16점 이상까지 hit** — *블랙잭 룰 정확성*.
|
|
111
|
+
- **상태 패턴 = 카드와 상태 결합 해소** — *플레이어 stay 상태 + 카드 차단*.
|
|
112
|
+
- **수익률 계산 위치 = 메타 질문으로 학생 자가 결정 유도** — *Participants vs FinalWinning*.
|
|
113
|
+
- **Bust 무조건 패배 = 상대 패 무관** — *블랙잭 룰 정확성*.
|
|
114
|
+
- **MutableMap 인자 = 부수효과 시그니처** — *calculate 메서드 반환 + 외부 변경* 분리.
|
|
115
|
+
- **`_cardDeck` + `cardDeck` 이중 표현 = 불필요한 중복 + 추측 코딩** — *YAGNI 위반*.
|
|
116
|
+
- **Fixture 활용 + 생성자 가변 인자** — *유연한 테스트 데이터*.
|
|
117
|
+
|
|
118
|
+
## 대표 인용
|
|
119
|
+
|
|
120
|
+
**페로로 (Bust 무조건 패배, Role.kt):**
|
|
121
|
+
> 내가 버스트라면 상대의 패와 상관없이 무조건 패배합니다.
|
|
122
|
+
|
|
123
|
+
**페로로 (수익률 책임 위치 메타 질문, Participants.kt):**
|
|
124
|
+
> 수익률은, 게임 결과인 FinalWinning이 계산하는 것과 Participants가 계산하는 것 중 누가 하는 것이 적절하다고 생각하시나요?
|
|
125
|
+
|
|
126
|
+
**페로로 (딜러 베팅 도메인 구분, Dealer.kt):**
|
|
127
|
+
> 배팅 금액은 플레이어에게만 있는 개념이 아닐까요?
|
|
128
|
+
> 딜러의 입장에서는, 배팅을 하지 않으니까요
|
|
129
|
+
|
|
130
|
+
**페로로 (1단계 진단 연장, CardHand.kt:31):**
|
|
131
|
+
> 플레이어는 스테이 상태를 선언하면, 카드를 더 이상 뽑을 수 없어요.
|
|
132
|
+
> 이 개념을 구현 해보시면 좋을 것 같습니다.
|
|
133
|
+
|
|
134
|
+
**페로로 (이중 표현 무의미, RandomDeck.kt:6):**
|
|
135
|
+
> 둘 다 모두 `List<Card>` 타입이고, 따로 두개가 나뉘어진 이유가 모르겠네요!?
|
|
136
|
+
|
|
137
|
+
**페로로 (Fixture 활용 권고, RoleTest.kt:159):**
|
|
138
|
+
> 꼼꼼한 테스트 좋았습니다.
|
|
139
|
+
> Fixture를 조금 더 활용한다면, 이렇게도 생성해 볼 수 있어요.
|
|
140
|
+
> ```kotlin
|
|
141
|
+
> val dealer = Dealer(HEART_TEN, HERART_SEVEN)
|
|
142
|
+
> val player = Player(HEART_TEN, HEART_FIVE)
|
|
143
|
+
> ```
|
|
144
|
+
|
|
145
|
+
**학생 자가 답변 (수익률 책임 자가 결정, Participants.kt):**
|
|
146
|
+
> FinalWinning이 좀 더 적절한 것 같습니다! Participants와 FinalWinning 중 고민 했었는 데 FinalWinning으로 수익률을 계산하는 것을 옮겨보니 코드가 간결해졌다는 걸 느꼈습니다. 감사합니다!
|
|
147
|
+
|
|
148
|
+
**학생 자가 답변 (1단계 진단 인용 + 후속 반영, CardHand.kt:31):**
|
|
149
|
+
> > 지난번 플레이어와 딜러가 카드 상태랑 강하게 결합되어 있다는 말을 드렸는데,
|
|
150
|
+
> > 플레이어가 스테이가 될 수 있다는 상태가 고려한다면 도움이 좀 될 것 같습니다.
|
|
151
|
+
>
|
|
152
|
+
> 이와 관련해 step1에서 남겨 주신 조언 참고해서 피드백 반영해보았습니다!
|
|
153
|
+
|
|
154
|
+
**학생 자가 답변 (Bust 룰 정확성 자가 정리, Role.kt):**
|
|
155
|
+
> ```
|
|
156
|
+
> - 플레이어가 Bust라면 딜러의 패와 상관없이 무조건 패
|
|
157
|
+
> - 딜러가 Bust이고, 플레이어가 Bust가 아니라면 딜러 패
|
|
158
|
+
> ```
|
|
159
|
+
> 피드백 주신 내용 참고해 위의 두가지 조건 추가하였습니다!
|
|
160
|
+
|
|
161
|
+
**학생 자가 답변 (추측 코딩 자가 인식, RandomDeck.kt:6):**
|
|
162
|
+
> _cardDeck에는 실제 카드 덱을 저장하고, cardDeck을 이용해 클래스 외부에서는 카드 덱 데이터를 읽을 수는 있지만, 직접 수정할 수는 없게 하려고 했었습니다. 리팩터링 하다보니 cardDeck을 외부에서 사용할 때가 없어졌는 데 추후에 사용할 일이 있을까봐 일단은 private으로 설정해뒀습니다!
|
|
163
|
+
|
|
164
|
+
## 얻은 교훈
|
|
165
|
+
|
|
166
|
+
1. ***플레이어 준비 + 베팅 금액 동시 입력 = 생성 시점에 모든 정보 응집***. PR #85·#88·#90·#108·#133 와 같은 결. *Player(name, betAmount) 생성 시점에 한 번에 받음*.
|
|
167
|
+
|
|
168
|
+
2. ***딜러 ≠ 플레이어 = 도메인 멤버 차이***. *Dealer 는 베팅 안 함 → betAmount 미보유*. *Player 와 Dealer 의 비대칭이 도메인 룰 표현*. PR #133·#85·#136 와 같은 결.
|
|
169
|
+
|
|
170
|
+
3. ***블랙잭 Bust 룰 = "무조건 패배 (상대 패 무관)"*** = *카지노 룰 정확성*. *플레이어 Bust → Lose 즉시*, *양측 Bust → 플레이어 Lose*, *딜러 Bust + 플레이어 비Bust → 플레이어 Win*. PR #128·#135·#114·#125·#108·#133·#132·#136·#90·#88·#85 와 같은 결.
|
|
171
|
+
|
|
172
|
+
4. ***메타 질문으로 자가 결정 유도 = 학습 모범***. *페로로의 "Participants vs FinalWinning 중 누가 적절한가?"* 메타 질문 → *학생 자가 답변 + 근거 명시*. *맞고 틀림 X, 트레이드오프*. PR #131·#136·#88 와 같은 결의 reviewer 스타일.
|
|
173
|
+
|
|
174
|
+
5. ***1단계 진단 인용 + 후속 반영 = 진단 인식 학습 모범***. *학생이 1단계 페로로 코멘트 직접 인용*. *진단 누적 + 후속 회기 회피*. PR #128·#135·#108·#133·#136 와 같은 결.
|
|
175
|
+
|
|
176
|
+
6. ***`_cardDeck` + `cardDeck` 이중 표현 = 추측 코딩 + YAGNI 위반***. *Kotlin backing field 패턴 = `private val _x` + `val x: get() = _x.toList()`*. *둘 다 private + 동일 타입* 이면 *불필요한 중복*. *현재 사용처 시작 + 필요 시 추가* 정공.
|
|
177
|
+
|
|
178
|
+
7. ***`calculatePlayerProfit(MutableMap)` 인자 = 부수효과 메서드 시그니처***. *PR #85 (하디 2단계) 의 calculateFinalProfits 진단* 와 같은 결. *calculate = 반환*, *부수효과 ≠ calculate 어휘*. *학생 자가 후퇴*.
|
|
179
|
+
|
|
180
|
+
8. ***Fixture 활용 + 생성자 가변 인자 = 유연한 테스트 데이터***. *PR #90 (케이엠) 의 fixture + CsvSource* 와 같은 결. *현재 학생은 학습 진행 중* — *fixture 의미 자가 질문*.
|
|
181
|
+
|
|
182
|
+
9. ***`RandomDeck` naming = ShuffleStrategy interface vs 클래스 직접*** = *전략 패턴 정공 vs 단일 구현*. PR #108·#133·#136·#93 의 *ShuffleStrategy / DeckManager interface* 와 *반대 트레이드오프*. *테스트 시 결정적 카드 시퀀스 필요* 시 *전략 패턴*이 정공.
|
|
183
|
+
|
|
184
|
+
10. ***학생 자가 답변에 커밋 SHA 첨부 = 진단 → 후속 반영 흐름 명시***. *14775ee, 55d2dcf, e0f3ef7, a69ea03, 2253b73, 4503d84, 68dd994* 등 다수. *학습 가시화 패턴 일관성*. PR #128·#135·#108·#133·#88·#136 와 같은 결.
|
|
185
|
+
|
|
186
|
+
11. ***리뷰어 메타 질문 + 학생 자가 결정 + 근거 명시 + 코드 간결성 trade-off 명시 = 학습 모범***. *PR #103 은 짧지만 깊은 토론* — *짧은 PR 이라도 학습 가시화 가능*. PR #131·#136 와 같은 결의 *짧은 PR + 풍부한 자가 학습*.
|
|
187
|
+
|
|
188
|
+
12. ***수익률 계산 책임 후보 (Participants vs FinalWinning) = 트레이드오프 명시***. *Participants 자기 책임 (Tell-Don't-Ask) vs Result 객체 응집*. *둘 다 합리*. *학생 자가 결정 근거 = 코드 간결성*. *결정의 근거 명시 자체*가 *학습 가치*. PR #85·#108·#131·#132·#133·#136·#152 와 같은 결의 *책임 위치 토론*.
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# PR #81 — [블랙잭 1단계] 해나 미션
|
|
2
|
+
|
|
3
|
+
- **Reviewee:** [@hxeyexn](https://github.com/hxeyexn)
|
|
4
|
+
- **PR:** https://github.com/woowacourse/kotlin-blackjack/pull/81
|
|
5
|
+
- **단계:** 1단계
|
|
6
|
+
- **리뷰어:** @laco-dev
|
|
7
|
+
- **라인 코멘트:** 30 (리뷰어 19 / 리뷰이 11)
|
|
8
|
+
|
|
9
|
+
## 잘한 점 (설계 관점)
|
|
10
|
+
|
|
11
|
+
- **`CardHandState` enum + `precondition` 속성** — 상태별 임계점 상수화 (후속 반영).
|
|
12
|
+
- **`PlayerName` 원시값 포장**.
|
|
13
|
+
- **`abstract class Role` + `Player`/`Dealer`** + 후속에 `addInitialCards` 추상 공통화.
|
|
14
|
+
- **`CardGenerator` 인터페이스 + `RandomCardGenerator`/`ExplicitCardGenerator`** — 테스트 fake 분리.
|
|
15
|
+
- **`PlayerWinning.judgeDealerWinningResult` (groupingBy + eachCount + reverse) — 역집계** (후속 반영).
|
|
16
|
+
- **후속 반영 — Ace 1점 기본 + 11 검토 룰 변경 / Singleton Deck → CardIndex reset / Shape/Number UI → OutputView / canDraw() 상태 반환 / Referee 제거 + Dealer로 책임 이전**.
|
|
17
|
+
|
|
18
|
+
## 못한 점 (설계 관점)
|
|
19
|
+
|
|
20
|
+
### 1. `CardShape.shape: String` UI 표현
|
|
21
|
+
|
|
22
|
+
```kotlin
|
|
23
|
+
enum class CardShape(val shape: String) { HEART("하트"), CLOVER("클로버"), ... }
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
리뷰어: "*"하트", "클로버" 는 UI 로직이 아닐까요? 가령 `♤ ♠` 처럼 출력해야 한다면 도메인 모델의 수정이 불가피*합니다." — **12개 PR 연속 enum UI value**.
|
|
27
|
+
|
|
28
|
+
### 2. `CardNumber.JUMP` — JACK 오타
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
enum class CardNumber(val number: Int, val output: String = number.toString()) {
|
|
32
|
+
ACE(11, "A"), TEN(10), KING(10), QUEEN(10),
|
|
33
|
+
JUMP(10), // ⚠ JACK 오타
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
리뷰어: "*플레잉 카드에서 J는 JACK 입니다!*" — *도메인 어휘 정확성*. `JUMP`는 *도메인 부재*. **JACK 명사 모름 = 도메인 조사 부족 신호**.
|
|
38
|
+
|
|
39
|
+
### 3. `CardNumber.ACE.number = 11` 기본값
|
|
40
|
+
|
|
41
|
+
→ PR #119·#29·#112·#17과 동일. *Ace 1 기본*이 도메인 룰. 학생 후속 인정: "*제가 규칙을 잘못 이해하고 있었네요* 🥲".
|
|
42
|
+
|
|
43
|
+
### 4. `CardDeck` Singleton + 게임 단발
|
|
44
|
+
|
|
45
|
+
```kotlin
|
|
46
|
+
object CardDeck {
|
|
47
|
+
private val cardDeck = CardShape.entries.flatMap { ... }.shuffled()
|
|
48
|
+
private var cardIndex = 0
|
|
49
|
+
fun getRandomCard(): Card = cardDeck[cardIndex++]
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
리뷰어: "*단 하나만 존재하는 덱이네요* 😱 *게임이 여러 번 진행 되면 어떤 일이 발생할까요?*"
|
|
54
|
+
|
|
55
|
+
학생 자가 인정: "*플레이어 수를 6명으로 제한해 52장의 카드를 모두 소진할 일이 없다고만 생각했습니다. 게임이 여러 번 진행되었을 때는 고려하지 못했던 것 같습니다..!* CardIndex 를 reset 하는 방식으로 수정해보았습니다." — **Singleton + reset** = *상태 가변 + Singleton 결합 = 더 복잡*. *class Deck + 매 게임 새 인스턴스*가 정답. 학생의 reset 패치는 *Singleton 유지의 미봉책*.
|
|
56
|
+
|
|
57
|
+
### 5. `CardHand.sum()`의 `while + 차감 + count Ace`
|
|
58
|
+
|
|
59
|
+
```kotlin
|
|
60
|
+
fun sum(): Int {
|
|
61
|
+
var aceCount = hand.count { it.number == CardNumber.ACE }
|
|
62
|
+
var tempSum = hand.sumOf { it.number.number }
|
|
63
|
+
while (aceCount >= MIN_ACE_COUNT && tempSum > BLACK_JACK) {
|
|
64
|
+
aceCount--
|
|
65
|
+
tempSum -= SUBTRACTION_BETWEEN_MAX_AND_MIN
|
|
66
|
+
}
|
|
67
|
+
return tempSum
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
리뷰어: "*블랙잭에서 A 카드의 기본 점수는 1점입니다.* 아래 점수 계산 규칙을 참고해보시고, *어떻게 수정할 수 있을지 고민 해보세요* :) > *에이스 카드가 포함되어 있을 때, 카드들의 점수 합계가 11점보다 낮다면 보너스 점수 10점을 획득한다.*"
|
|
72
|
+
|
|
73
|
+
→ PR #112·#29·#33·#10·#17·#119와 동일한 *while + 차감* 패턴. *단일 룰*로 단순화. 학생 후속 반영.
|
|
74
|
+
|
|
75
|
+
### 6. `CardHand.addNewCard()`이 `CardDeck.getRandomCard()` 직접 호출
|
|
76
|
+
|
|
77
|
+
```kotlin
|
|
78
|
+
fun addNewCard() {
|
|
79
|
+
_hand.add(CardDeck.getRandomCard()) // ⚠ Singleton 직접 호출
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
리뷰어: "*무엇이 들어올지 모르는 카드를 뽑게 되는 행위는 테스트가 가능한 구조*일까요?" — *Singleton 의존 = 테스트 격리 불가*. `addNewCard(card: Card)` 또는 `addNewCard(generator: CardGenerator)`. 학생 후속: `ExplicitCardGenerator` 도입.
|
|
84
|
+
|
|
85
|
+
### 7. `Player.getState()` *Bust + BlackJack + 카드 합* — *Hit/Stay 누락*
|
|
86
|
+
|
|
87
|
+
```kotlin
|
|
88
|
+
override fun getState(): CardHandState {
|
|
89
|
+
val sum = cardHand.sum()
|
|
90
|
+
return when {
|
|
91
|
+
sum > BLACK_JACK -> CardHandState.BURST
|
|
92
|
+
sum == BLACK_JACK -> CardHandState.BLACKJACK
|
|
93
|
+
else -> CardHandState.STAY // ⚠ 21 미만이면 무조건 STAY?
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
리뷰어: "*플레이어의 상태는 단순히 카드 점수로만 판단할 수 없습니다.* 가령 *21점이 넘지 않더라도 플레이어가 더 뽑겠다고 한다면 HIT 상태가 되고, 그만 뽑겠다고 하면 STAY 상태*가 됩니다. *상태를 반환하는 방식과 상태를 내부적으로 변경 가능하도록 가지고 있도록 하는 차이*가 있을 것 같습니다. `var state: State; private set`"
|
|
99
|
+
|
|
100
|
+
→ **상태가 *점수만으로 결정*되지 않음**. *21 미만 + HIT 의사 = HIT*, *21 미만 + STAY 의사 = STAY*. *유저 선택*이 상태 전이의 트리거. 학생 후속: `CardHandState.DRAW_POSSIBILITY`로 *카드 더 받을 수 있음*만 표현, *Hit/Stay 결정*은 외부에서.
|
|
101
|
+
|
|
102
|
+
### 8. `BLACK_JACK = 21` 상수가 *여러 곳 중복*
|
|
103
|
+
|
|
104
|
+
리뷰어: "*`블랙잭 = 21` 이라는 값이 여러군데서 재사용이 되고 있어요.* 만약 *블랙잭 점수가 22점으로 바뀐다면 악몽이 벌어지지 않을까요?*" — *도메인 상수의 단일 정의*. 학생 후속: `CardHandState.BLACKJACK.precondition`으로 *enum 속성*에 통합.
|
|
105
|
+
|
|
106
|
+
### 9. `Referee` 정적 비교자 → 학생 Dealer로 이전
|
|
107
|
+
|
|
108
|
+
리뷰어: "*승부를 판단하는 로직은 참가자가 스스로 할 수 있지 않을까요?* *Referee 라는 객체는 단순히 함수를 분리한 것으로밖에 보이지 않아, 클래스로서의 목적이 명확하지 않습니다.* WinningResult를 만들어 내기에 적절한 위치는 없을까요?"
|
|
109
|
+
|
|
110
|
+
학생 자가 인정: "*클래스의 역할과 책임에 대해 다시 한 번 생각해 볼 수 있게 질문 주셔서 감사합니다.* 🙇 *승부를 판단하는 로직은 Dealer의 책임이라는 판단*이 서서 *Dealer로 해당 로직을 이동*시켰습니다."
|
|
111
|
+
|
|
112
|
+
→ **Referee → Dealer 이전은 *PR #28·#63 권고와 부분 일치 + 참가자 자율성과 부분 어긋남***. *Dealer가 비교자*는 *현실 비유 충실*, *Tell-Don't-Ask는 player.match(other)*. 학생은 *중간 단계* 도달.
|
|
113
|
+
|
|
114
|
+
### 10. `PlayerWinning(result: Map<...>)` data class — *역할 모호*
|
|
115
|
+
|
|
116
|
+
```kotlin
|
|
117
|
+
data class PlayerWinning(val result: Map<PlayerName, WinningResultStatus>)
|
|
118
|
+
data class DealerWinning(val result: Map<WinningResultStatus, Int>)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
리뷰어: "*객체 이름만 본다면, 플레이어 하나의 승부 결과를 가지고 있을 것처럼 느껴지는데, 실제로는 무엇을 하는지 잘 모르겠어요.* *이 클래스가 정말 필요한 것일까요?*"
|
|
122
|
+
|
|
123
|
+
학생 자가 변호: "*data class 내 딜러의 승부를 판단하는 책임은 불필요하지만, PlayerWinning이라는 class 자체는 플레이어들의 결과를 담고 있어야 하기 때문에 필요하다고 생각*합니다..!"
|
|
124
|
+
|
|
125
|
+
→ **명사 PlayerWinning vs 실제 보유 (Map<Player, Status>) 의미 불일치**. *PlayerWinning = 플레이어 하나의 결과* 직관 vs *실제 = 다수 플레이어의 결과 묶음*. `PlayersResult` 또는 *Map 노출* 자체가 자연. 단수/복수 명명 정확성.
|
|
126
|
+
|
|
127
|
+
### 11. `DealerWinning.result: Map<WinningResultStatus, Int>` value 의미 모호
|
|
128
|
+
|
|
129
|
+
```kotlin
|
|
130
|
+
data class DealerWinning(val result: Map<WinningResultStatus, Int>)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
리뷰어: "*result 에 담겨있는 value 값이 무엇인지 알기 어려워 보입니다.* 적절한 메소드를 통해 메시지를 전달 해보면 어떨까요? `fun getWinningCount(): Int { ... } fun getDrawCount(): Int { ... }`" — *Map 자료구조 그대로 노출* < *메서드로 의미 명시*. *호출자가 Map["WIN"] 같은 키 추측* 회피.
|
|
134
|
+
|
|
135
|
+
후속 댓글: "*이 의문이 해결되지 않았어요. 아직 `getFinalResult()` 의 반환 타입이 무엇인지 모르지 않을까요?*" — 학생이 *getFinalResult(): Map<WinningResultStatus, Int>* 형태로 *그대로 반환*. 리뷰어는 *반환 타입 자체가 의미*임을 재강조.
|
|
136
|
+
|
|
137
|
+
### 12. `BlackJack.runPlayerPhase`의 *상태 판단 + 입력 + 분기 한 줄*
|
|
138
|
+
|
|
139
|
+
```kotlin
|
|
140
|
+
private fun runPlayerPhase(it: Player) {
|
|
141
|
+
while (it.getState() == CardHandState.STAY && inputView.readIsHit(it)) {
|
|
142
|
+
it.runPhase()
|
|
143
|
+
outputView.printPlayerCardHand(it)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
학생 자가 인정: "*하지만 초반 설계처럼 runPhase의 파라미터 값에 HIT 여부를 넣고, while(runPhase(inputView.readIsHit))의 형태로 컨트롤러에서 사용하면 Player의 카드 패가 Black Jack 이거나 BUST 라도 플레이어에게 카드를 더 받겠냐는 질문을 한번 더 출력*하게 됩니다."
|
|
149
|
+
|
|
150
|
+
리뷰어: "*블랙잭 게임에서 STAY는 카드를 더이상 뽑지 않겠다를 선언한다는 의미*입니다. *블랙잭 도메인이 어려워 이 부분은 잘못 알고 계신 것 같네요.* [...] *카드를 더 뽑을 수 있는지 여부를 묻는 로직*이 보이지 않는데요. *Input 이전에 플레이어 혹은 딜러가 카드를 더 뽑을 수 있는지를 물어봐야 하지 않을까요?* `player.canDraw() && askDraw(player)`"
|
|
151
|
+
|
|
152
|
+
→ **블랙잭 STAY 의미 오해**: 학생의 `CardHandState.STAY`는 *21 미만 일반 상태*로 사용. 룰: *STAY = 사용자가 그만 뽑겠다 선언*. 학생 자가 인정 후 `canDraw()` 메서드 도입. PR #28·#114·#10과 같은 결.
|
|
153
|
+
|
|
154
|
+
### 13. `runPhase()` 명명 — *카드 뽑는 행위가 phase?*
|
|
155
|
+
|
|
156
|
+
리뷰어: "*또한 `runPhase` 라는 이름이 무엇을 의도하는지 잘 모르겠습니다. 단순하게 카드를 뽑는다는 행위로 나타내고 싶은게 아닌가요?* `drawTo(...)`" — *추상 명사*(`runPhase`/`processTurn`/`step`)보다 *구체 행위*(`drawCard`/`receiveCard`). PR #29·#92와 같은 결.
|
|
157
|
+
|
|
158
|
+
### 14. `BlackJack.cardDeck = CardDeck.cardDeck` — 클래스 레벨 + Singleton 참조
|
|
159
|
+
|
|
160
|
+
```kotlin
|
|
161
|
+
class BlackJack(...) {
|
|
162
|
+
private val cardDeck = CardDeck.cardDeck // ⚠ 멤버 + Singleton 참조
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
리뷰어: "*딜러와 플레이어는 지역변수로 준비가 되는데 덱은 클래스 레벨에서 생성을 하는 이유는 무엇일까요?*" — **일관성 누락**. *한 게임 = 한 인스턴스*면 *덱도 지역 변수*. *Singleton 잔재*가 *클래스 레벨* 보유로 드러남.
|
|
167
|
+
|
|
168
|
+
### 15. `Role`이 `CardGenerator` 의존 — Deck이 아닌 Generator
|
|
169
|
+
|
|
170
|
+
```kotlin
|
|
171
|
+
abstract class Role(open val name: PlayerName, open val cardHand: CardHand) {
|
|
172
|
+
fun addInitialCards(cardGenerator: CardGenerator) {
|
|
173
|
+
repeat(INITIAL_CARDS_COUNT) { cardHand.addNewCard(cardGenerator) }
|
|
174
|
+
}
|
|
175
|
+
fun runPhase(cardGenerator: CardGenerator) { ... }
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
리뷰어: "*참가자가 CardGenerator와 협력하는게 자연스러운 흐름인가요? 아니면 CardGenerator와 협력하는게 자연스러운 흐름인가요?* *덱을 통해 받지 않은 이유가 있나요?* *CardDeck이 고도화가 되고 역할이 만들어지지 않고, 엉뚱한 다른 객체가 만들어진 것 같아서요.*" — **`Deck`이 *카드 보유자 + 뽑기*면, `Generator`는 *Deck의 내부 구현* 또는 *Deck 생성용*. Role이 직접 Generator 의존 = *Deck 추상화 누수***. PR #24·#10·#29와 같은 결.
|
|
180
|
+
|
|
181
|
+
### 16. `Player.getState`가 *cardHand.sum()* 외부 계산
|
|
182
|
+
|
|
183
|
+
```kotlin
|
|
184
|
+
data class Player(...) : Role(...) {
|
|
185
|
+
override fun getState(): CardHandState {
|
|
186
|
+
val sum = cardHand.sum()
|
|
187
|
+
return when { ... }
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
리뷰어: "*CardHand가 CardHandState를 가지고 있어야 자연스럽지 않을까요??* 이미 *CardHand가 블랙잭 도메인에 강하게 결합*되어 있다면, *스스로 상태를 가지고 판단*하도록 하는게 어떨까요?" — *Player가 cardHand.sum()* + 분기 = *Tell-Don't-Ask 변형 위반*. `cardHand.getState()`가 자연.
|
|
193
|
+
|
|
194
|
+
### 17. `Dealer.canDraw()` — Player와 다른 메서드명
|
|
195
|
+
|
|
196
|
+
```kotlin
|
|
197
|
+
data class Dealer(...) : Role(...) {
|
|
198
|
+
fun canDraw(): Boolean = this.getState() == CardHandState.HIT
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
리뷰어: "*이 함수는 플레이어와 딜러가 모두 동일하게 가지고 있다면, 추상 함수로 만들어 볼 수 있지 않을까요?*" — `canDraw()`가 *공통 행위*면 `Role.canDraw(): Boolean` 추상. *Dealer 단독*은 *추상화 누락*.
|
|
203
|
+
|
|
204
|
+
### 18. `Participants.getPlayerResult` + 별도 `getDealerResult` — 결과 객체 분산
|
|
205
|
+
|
|
206
|
+
```kotlin
|
|
207
|
+
data class Participants(val dealer: Dealer, val players: Players) {
|
|
208
|
+
fun getPlayerResult(): Map<PlayerName, Int> = ...
|
|
209
|
+
// getDealerResult가 별도
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
리뷰어: "*결과를 만들어내는 동작이 왜 따로따로 존재하는지 의아*합니다. *플레이어 결과와 딜러 결과를 모두 가지는 게임 결과를 생성하도록 만들 수 있지 않을까요?* *그 역할은 누가 해야 적절할까요?*" — *GameResult* 단일 객체에 *Player + Dealer 결과*. PR #112·#135·#92와 같은 결.
|
|
214
|
+
|
|
215
|
+
### 19. `CardHandTest`에 *명시 deck + 합산 + Ace 보정* 다중 검증
|
|
216
|
+
|
|
217
|
+
```kotlin
|
|
218
|
+
class CardHandTest {
|
|
219
|
+
// 딜러나 플레이어 카드 패의 합을 구하는 동작은 완전히 같다.
|
|
220
|
+
private val explicitCardDeck = listOf(... 7장 ...)
|
|
221
|
+
@Test fun `...`() { ... }
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
리뷰어: "*무엇을 테스트 하고 싶은 걸까요??* 🤔" / "*이 규칙으로 시나리오를 다시 고려 해보셨을까요? 테스트가 너무 복잡하게 판단이 되는 것 같습니다.* *TDD로 구현한다*..."
|
|
226
|
+
|
|
227
|
+
→ **테스트 의도 불명** + **시나리오 복잡 = TDD 사이클 위반**. *한 테스트 = 한 시나리오*가 *Red 단계의 명확성*. *7장 fixture*는 *여러 시나리오가 한 데이터에 섞임*.
|
|
228
|
+
|
|
229
|
+
### 20. `DealerTest`에 *테스트 로직 보유*
|
|
230
|
+
|
|
231
|
+
```kotlin
|
|
232
|
+
@Test fun `...`() {
|
|
233
|
+
if (dealer.getState() == CardHandState.HIT) { // ⚠ 테스트에 if 분기
|
|
234
|
+
// 한 장 더 뽑기 검증
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
리뷰어: "*테스트 코드에 로직을 포함하면 안됩니다.* 한 장을 더 뽑는다는 메시지는 *`canDraw()` 를 통해 판단해야 하지 않을까요?*" — *테스트 = 명세*. *if 분기는 두 가지 시나리오를 한 테스트에 담음*. *시나리오 분리*가 정답.
|
|
240
|
+
|
|
241
|
+
## 리뷰어 의견 요지
|
|
242
|
+
|
|
243
|
+
- ***enum UI value (12개 PR 연속)***.
|
|
244
|
+
- ***JACK 오타 = 도메인 어휘 부정확***.
|
|
245
|
+
- ***Ace 1 기본 (학생 자가 인정)***.
|
|
246
|
+
- ***Singleton Deck + reset = 미봉책*** — class + 매 게임 새 인스턴스.
|
|
247
|
+
- ***while + 차감 Ace 보정 < 단일 룰***.
|
|
248
|
+
- ***CardHand가 Singleton Deck 직접 호출 = 테스트 불가***.
|
|
249
|
+
- ***Player 상태 = 점수 외 유저 선택 결합*** — HIT/STAY는 의지의 결과.
|
|
250
|
+
- ***`BLACK_JACK = 21` 상수 중복*** — enum 속성으로 단일 정의.
|
|
251
|
+
- ***Referee → Dealer 이전은 중간 단계*** — 참가자 자율성이 정답.
|
|
252
|
+
- ***`PlayerWinning(Map<Player, Status>)` 단수/복수 명명 불일치***.
|
|
253
|
+
- ***Map 그대로 노출 < 메서드로 의미 명시***.
|
|
254
|
+
- ***블랙잭 STAY = 그만 뽑겠다 선언*** — 학생 도메인 오해.
|
|
255
|
+
- ***`runPhase` 추상 명사 < `drawCard` 구체 행위***.
|
|
256
|
+
- ***Deck 클래스 레벨 + 참가자 지역 변수 = 일관성 누락***.
|
|
257
|
+
- ***Role이 Generator 직접 의존 = Deck 추상화 누수***.
|
|
258
|
+
- ***`player.getState`가 cardHand.sum() = CardHand가 state 보유 자연***.
|
|
259
|
+
- ***Dealer.canDraw 단독 = 추상화 누락*** — Role.canDraw 추상.
|
|
260
|
+
- ***Player + Dealer 결과 분산 = GameResult 단일 객체***.
|
|
261
|
+
- ***테스트 7장 fixture = 시나리오 다중*** — 한 테스트 한 시나리오.
|
|
262
|
+
- ***테스트 로직 (if 분기) = 시나리오 분리 필요***.
|
|
263
|
+
|
|
264
|
+
## 대표 인용
|
|
265
|
+
|
|
266
|
+
> 단 하나만 존재하는 덱이네요 😱 *게임이 여러 번 진행 되면 어떤 일이 발생할까요?*
|
|
267
|
+
> — @laco-dev on `CardDeck.kt`
|
|
268
|
+
|
|
269
|
+
> 플레이어의 상태는 *단순히 카드 점수로만 판단할 수 없습니다*. 가령 *21점이 넘지 않더라도 플레이어가 더 뽑겠다고 한다면 HIT 상태가 되고, 그만 뽑겠다고 하면 STAY 상태*가 됩니다.
|
|
270
|
+
> — @laco-dev on `Player.kt`
|
|
271
|
+
|
|
272
|
+
> 승부를 판단하는 로직은 *참가자가 스스로 할 수 있지 않을까요? Referee 라는 객체는 단순히 함수를 분리한 것으로밖에 보이지 않아, 클래스로서의 목적이 명확하지 않습니다.*
|
|
273
|
+
> — @laco-dev on `Referee.kt`
|
|
274
|
+
|
|
275
|
+
> 참가자가 CardGenerator와 협력하는게 자연스러운 흐름인가요? 아니면 CardGenerator와 협력하는게 자연스러운 흐름인가요? *덱을 통해 받지 않은 이유가 있나요?* CardDeck이 고도화가 되고 역할이 만들어지지 않고, *엉뚱한 다른 객체가 만들어진 것 같*아서요.
|
|
276
|
+
> — @laco-dev on `Role.kt`
|
|
277
|
+
|
|
278
|
+
> `CardHand가 CardHandState를 가지고 있어야 자연스럽지 않을까요?? 이미 CardHand가 블랙잭 도메인에 강하게 결합되어 있다면, 스스로 상태를 가지고 판단하도록* 하는게 어떨까요?
|
|
279
|
+
> — @laco-dev on `Player.kt`
|
|
280
|
+
|
|
281
|
+
## 얻은 교훈
|
|
282
|
+
|
|
283
|
+
- ***enum UI value = 12개 PR 연속 (MCP 룰 후보 최강)***.
|
|
284
|
+
- ***JACK 오타 = 도메인 어휘 정확성 부족 신호*** — *플레잉 카드 룰*을 *코드 작성 전 조사*.
|
|
285
|
+
- ***Singleton Deck + reset = 미봉책*** — *class + 매 게임 새 인스턴스*가 정답. PR #65·#79·#125·#92·#33·#10·#17와 같은 결.
|
|
286
|
+
- ***while + 차감 Ace 보정 = 알고리즘으로 룰 흩뜨림*** — *Ace 1 기본 + 11 검토 단일 룰*. 8개+ PR 연속.
|
|
287
|
+
- ***Singleton Deck을 도메인 메서드가 직접 호출 = 테스트 격리 불가*** — Generator 인터페이스 주입.
|
|
288
|
+
- ***Player 상태 = 점수 + 유저 의지 결합*** — *21 미만 + HIT 의사 = HIT*. *점수만으로 STAY 결정*은 도메인 오해.
|
|
289
|
+
- ***`BLACK_JACK = 21` 상수 중복 = 변경 시 여러 곳 수정*** — enum 속성 또는 단일 정의.
|
|
290
|
+
- ***Referee → Dealer 이전은 중간 단계*** — *Dealer 비교자*는 *현실 비유*, *Tell-Don't-Ask*는 *player.match(other)*. 학생이 *중간 단계 도달*.
|
|
291
|
+
- ***`PlayerWinning(Map<Player, Status>)` 단수/복수 명명 불일치*** — *PlayerWinning = 1인분*인지 *다수의 결과 묶음*인지. *PlayersResult* 같은 *복수형*이 자연.
|
|
292
|
+
- ***Map 자료구조 그대로 노출 < 메서드로 의미 명시*** — `getWinningCount()` / `getDrawCount()`.
|
|
293
|
+
- ***블랙잭 STAY = 그만 뽑겠다 선언, 일반 상태 X*** — *학생 도메인 오해*. **블랙잭 룰 정확 이해가 13개+ PR 반복 권고 (MCP 룰 후보)**.
|
|
294
|
+
- ***`runPhase` 추상 명사 < `drawCard` 구체 행위*** — *동작 = 동사*가 가독성. PR #29·#92와 같은 결.
|
|
295
|
+
- ***Deck 클래스 레벨 + 참가자 지역 변수 = 일관성 누락*** — *Singleton 잔재*가 멤버 보유로 드러남.
|
|
296
|
+
- ***Role이 Generator 직접 의존 = Deck 추상화 누수*** — *Generator는 Deck의 내부 구현*. *Role은 Deck과만 협력*.
|
|
297
|
+
- ***`player.getState`가 cardHand.sum() = CardHand가 state 보유 자연*** — *CardHand가 블랙잭 도메인 결합*되어 있으면 *스스로 상태 판단*.
|
|
298
|
+
- ***Dealer.canDraw 단독 = 추상화 누락*** — `Role.canDraw` 추상.
|
|
299
|
+
- ***Player + Dealer 결과 분산 = GameResult 단일 객체*** — *결과 생성 책임자*는 *진행자(Game)*가 자연.
|
|
300
|
+
- ***테스트 7장 fixture = 시나리오 다중 = TDD Red 단계 명확성 위반*** — *한 테스트 한 시나리오*.
|
|
301
|
+
- ***테스트 로직 (if 분기) = 두 시나리오 한 테스트*** — 분리.
|