├── .gitignore ├── 2016-csh-lyh ├── .gitignore ├── README.md ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── com │ └── wholeman │ └── leapyear │ └── GetDayTest.kt ├── 2016-hj-ys ├── 2016.kt └── 2016Test.kt ├── 2016-joker └── dayname_test.py ├── 2016-ym-skc └── 2016-ym-skc_test.py ├── README.md ├── budget-csh-lyh ├── .gitignore ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── com │ └── codingdojo │ └── budget │ └── SolutionTest.kt ├── budget-hys-hhj ├── Budget.kt └── BudgetTest.kt ├── budget-joker └── budge_test.py ├── budget-skc-kyh ├── README.md └── budget-skc-kyh.test.js ├── budget-young-and-old └── budget.ex ├── dart-jbj-lyh ├── README.md ├── dart.test.js ├── package-lock.json └── package.json ├── dart-jjc-sk └── dart_test.py ├── dart-joker ├── .nvmrc ├── dart.test.js ├── package-lock.json └── package.json ├── dart-mgh-hys-hhj ├── DartGame.kt └── DartGameTest.kt ├── dart-skc-csh ├── README.MD ├── dart.test.js ├── package-lock.json └── package.json ├── deletepairs-cena-kyh-khj ├── deletepairs.test.js ├── package-lock.json └── package.json ├── deletepairs-cena ├── deletepairs.test.js ├── package-lock.json └── package.json ├── deletepairs-hhj-hys ├── delete-pair-hhj-hys.test.js ├── package-lock.json └── package.json ├── deletepairs-hye-ksh └── deleteparis-hye-ksh.py ├── deletepairs-mgh-csh-lyh ├── .gitattributes ├── .gitignore ├── READEME.md ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── deletepairs │ └── mgh │ └── csh │ └── lyh │ └── DeletePairsTest.kt ├── deletepairs-sm-j └── delete-pair.cpp ├── deletepairs-wholeman ├── .gitignore ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── com │ └── wholeman │ └── deletepairs │ └── SolutionTest.kt ├── diviosr-lyr-hys └── divisor.test.js ├── divisor-jbj-lkn ├── divisor.js └── divisor.test.js ├── divisor-joker └── divisor_test.py ├── divisor-lyh-kmj ├── README.md ├── dividedNumbers.test.js ├── package-lock.json └── package.json ├── divisor-solution-skc └── divisor-solution.test.js ├── failurerate-csh-kyh ├── .gitignore ├── failurerate.test.js ├── package-lock.json └── package.json ├── failurerate-hhj-hys-mkh ├── Failure.kt └── FailureTest.kt ├── failurerate-joker └── failure_test.py ├── failurerate-khj-psm └── fail_rate_test.py ├── failurerate-skc-lyh ├── README.md ├── failureRate.test.js ├── package-lock.json └── package.json ├── failurerate-skc ├── README.md └── failurerate.test.js ├── ironstick-csh-hhj ├── .gitignore ├── README.md ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── com │ └── codingdojo │ └── ironstick │ └── SolutionTest.kt ├── ironstick-ksh-hsj-joker └── ironstick_test.py ├── knumber-csh-lyh ├── README.md ├── knumber.test.js ├── package-lock.json └── package.json ├── knumber-hj-ys ├── KNumber.kt └── KNumberTest.kt ├── knumber-joker ├── .python-version ├── knumber_test.py └── requirements.txt ├── knumber-ym-dw └── k_number.cpp ├── marathon-csh-hys └── incomplete-player.test.js ├── marathon-dali ├── README.md ├── babel.config.js ├── marathon.js ├── marathon.test.js ├── package-lock.json └── package.json ├── marathon-khj-skc └── test_marathon.py ├── mocktest-csh-lyh ├── README.md ├── math-example.test.js ├── package-lock.json └── package.json ├── mocktest-dali ├── mocktest.test.js ├── package-lock.json └── package.json ├── mocktest-hys-skc-kji └── mock-test.test.js ├── norepeat-csh-lyh ├── README.md ├── norepeat.test.js ├── package-lock.json └── package.json ├── norepeat-hys-skc └── no-repeat.test.js ├── openchat-hhj-hys-lyh ├── OpenChat.kt └── OpenChatTest.kt ├── openchat-khj-kyh-skc ├── README.md ├── openchat.test.js ├── package-lock.json └── package.json ├── openchat-ksh-sj-ssg └── openchat_test.py ├── openchat-mgh-csh ├── .gitattributes ├── .gitignore ├── README.md ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── openchat │ └── mgh │ └── csh │ └── OpenChat.kt ├── openchat-sm-j └── openchat.cpp ├── peuniforms-csh-lyh ├── README.md ├── package-lock.json ├── package.json └── peuniforms.test.js ├── peuniforms-joker-cena └── peuniforms_test.py ├── phonenumbers-csh-lyh ├── .gitignore ├── README.md ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── com │ └── codingdojo │ └── phonenumbers │ └── SolutionTest.kt ├── phonenumbers-hys-las ├── PhoneNumbers.kt └── PhoneNumbersTest.kt ├── phonenumbers-jiun ├── phone-number.cc └── phone-number.py ├── phonenumbers-khj-kyh-will ├── package-lock.json ├── package.json └── phonenumbers.test.js ├── phonenumbers-sj-ksh-joker └── phonenumbers_test.py ├── phonenumbers-sm-j ├── .gitignore ├── README.md └── phone_number.cpp ├── primenumber-hys-hhj-lyh ├── primeNumber.kt └── primeNumberTest.kt ├── primenumber-khj-sj-joker └── primenumber_test.py ├── primenumber-kji-lhc ├── README.md ├── package-lock.json ├── package.json └── primeNumber.test.js ├── primenumber-kyh-skc ├── README.md └── primeNumber-kyh-skc.test.js ├── primenumber-sm-sungkm ├── build.sbt ├── project │ └── build.properties └── src │ ├── main │ └── scala │ │ └── Prime.scala │ └── test │ └── scala │ └── PrimeTest.scala ├── skilltree-csh-mkh ├── .gitignore ├── README.md ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── com │ └── codingdojo │ └── skilltree │ └── SolutionTest.kt ├── skilltree-hhj-hys ├── SkillTree.kt └── SkillTreeKtTest.kt ├── skilltree-khj-jjc └── skill-tree_test.py ├── skilltree-lyh-kyh-skc ├── README.md └── skillTree-lyh-kyh-skc.test.js ├── skilltree-sm-j-joker └── skilltree.cpp ├── trucks-csh-hhj ├── .gitignore ├── README.md ├── build.gradle.kts ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src │ └── test │ └── kotlin │ └── com │ └── codingdojo │ └── trucks │ └── SolutionTest.kt ├── trucks-joker └── trucks_test.py └── trucks-khj-kyh-skc ├── README.md ├── package-lock.json ├── package.json └── trucks.test.js /.gitignore: -------------------------------------------------------------------------------- 1 | # IDE 2 | .idea 3 | .vscode 4 | 5 | #-- Python --------------------------------------------- 6 | 7 | # Byte-compiled / optimized / DLL files 8 | __pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | 12 | # C extensions 13 | *.so 14 | 15 | # Distribution / packaging 16 | .Python 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | wheels/ 29 | *.egg-info/ 30 | .installed.cfg 31 | *.egg 32 | MANIFEST 33 | 34 | # PyInstaller 35 | # Usually these files are written by a python script from a template 36 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 37 | *.manifest 38 | *.spec 39 | 40 | # Installer logs 41 | pip-log.txt 42 | pip-delete-this-directory.txt 43 | 44 | # Unit test / coverage reports 45 | htmlcov/ 46 | .tox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | .hypothesis/ 54 | .pytest_cache/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | db.sqlite3 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # celery beat schedule file 82 | celerybeat-schedule 83 | 84 | # SageMath parsed files 85 | *.sage.py 86 | 87 | # Environments 88 | .env 89 | .venv 90 | env/ 91 | venv/ 92 | ENV/ 93 | env.bak/ 94 | venv.bak/ 95 | 96 | # Spyder project settings 97 | .spyderproject 98 | .spyproject 99 | 100 | # Rope project settings 101 | .ropeproject 102 | 103 | # mkdocs documentation 104 | /site 105 | 106 | # mypy 107 | .mypy_cache/ 108 | 109 | #-- Node.js --------------------------------------------- 110 | 111 | # Logs 112 | logs 113 | *.log 114 | npm-debug.log* 115 | yarn-debug.log* 116 | yarn-error.log* 117 | lerna-debug.log* 118 | 119 | # Diagnostic reports (https://nodejs.org/api/report.html) 120 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 121 | 122 | # Runtime data 123 | pids 124 | *.pid 125 | *.seed 126 | *.pid.lock 127 | 128 | # Directory for instrumented libs generated by jscoverage/JSCover 129 | lib-cov 130 | 131 | # Coverage directory used by tools like istanbul 132 | coverage 133 | *.lcov 134 | 135 | # nyc test coverage 136 | .nyc_output 137 | 138 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 139 | .grunt 140 | 141 | # Bower dependency directory (https://bower.io/) 142 | bower_components 143 | 144 | # node-waf configuration 145 | .lock-wscript 146 | 147 | # Compiled binary addons (https://nodejs.org/api/addons.html) 148 | build/Release 149 | 150 | # Dependency directories 151 | node_modules/ 152 | jspm_packages/ 153 | 154 | # TypeScript v1 declaration files 155 | typings/ 156 | 157 | # TypeScript cache 158 | *.tsbuildinfo 159 | 160 | # Optional npm cache directory 161 | .npm 162 | 163 | # Optional eslint cache 164 | .eslintcache 165 | 166 | # Microbundle cache 167 | .rpt2_cache/ 168 | .rts2_cache_cjs/ 169 | .rts2_cache_es/ 170 | .rts2_cache_umd/ 171 | 172 | # Optional REPL history 173 | .node_repl_history 174 | 175 | # Output of 'npm pack' 176 | *.tgz 177 | 178 | # Yarn Integrity file 179 | .yarn-integrity 180 | 181 | # dotenv environment variables file 182 | .env 183 | .env.test 184 | 185 | # parcel-bundler cache (https://parceljs.org/) 186 | .cache 187 | 188 | # next.js build output 189 | .next 190 | 191 | # nuxt.js build output 192 | .nuxt 193 | 194 | # gatsby files 195 | .cache/ 196 | public 197 | 198 | # vuepress build output 199 | .vuepress/dist 200 | 201 | # Serverless directories 202 | .serverless/ 203 | 204 | # FuseBox cache 205 | .fusebox/ 206 | 207 | # DynamoDB Local files 208 | .dynamodb/ 209 | 210 | # TernJS port file 211 | .tern-port 212 | 213 | #-- C++ --------------------------------------------- 214 | 215 | # Prerequisites 216 | *.d 217 | 218 | # Compiled Object files 219 | *.slo 220 | *.lo 221 | *.o 222 | *.obj 223 | 224 | # Precompiled Headers 225 | *.gch 226 | *.pch 227 | 228 | # Compiled Dynamic libraries 229 | *.so 230 | *.dylib 231 | *.dll 232 | 233 | # Fortran module files 234 | *.mod 235 | *.smod 236 | 237 | # Compiled Static libraries 238 | *.lai 239 | *.la 240 | *.a 241 | *.lib 242 | 243 | # Executables 244 | *.exe 245 | *.out 246 | *.app 247 | -------------------------------------------------------------------------------- /2016-csh-lyh/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | .idea -------------------------------------------------------------------------------- /2016-csh-lyh/README.md: -------------------------------------------------------------------------------- 1 | ## 1. 이해 2 | 3 | * 숫자의 범위 a: 1~12, b: 1~31 4 | * ["SUN","MON","TUE","WED","THU","FRI","SAT"] 5 | * 2016년 각 월별 일수 [31,29,31,30,31,30,31,31,30,31,30,31] 6 | 7 | ## 2. 계획 8 | 9 | 1. a를 받으면 1월 1일을 기준으로 a 전 월까지 일수를 모두 더하여 10 | a월 1일 기준으로 일수를 만든다. 11 | 2. 1에서 구한 일수를 7로 나눈 나머지를 구한다. 12 | 3. 밑에 나머지 별 요일표를 기준으로 return 13 | 나머지 14 | 0 THU 15 | 1 FRI 16 | 2 SAT 17 | 3 SUN 18 | 4 MON 19 | 5 TUE 20 | 6 WED 21 | 22 | ## 3. 실행 23 | 24 | ## 4. 반성 25 | -------------------------------------------------------------------------------- /2016-csh-lyh/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM. 9 | id("org.jetbrains.kotlin.jvm").version("1.3.20") 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving your dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Use the Kotlin JDK 8 standard library. 23 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 24 | 25 | // Use the Kotlin test library. 26 | testImplementation("org.jetbrains.kotlin:kotlin-test") 27 | 28 | // Use the Kotlin JUnit integration. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 30 | 31 | testImplementation("org.assertj:assertj-core:3.11.1") 32 | } 33 | 34 | application { 35 | // Define the main class for the application. 36 | mainClassName = "com.wholeman.leapyear.AppKt" 37 | } 38 | -------------------------------------------------------------------------------- /2016-csh-lyh/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/2016-csh-lyh/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /2016-csh-lyh/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /2016-csh-lyh/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS='"-Xmx64m"' 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /2016-csh-lyh/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /2016-csh-lyh/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.2/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "2016-csh-lyh" 11 | -------------------------------------------------------------------------------- /2016-csh-lyh/src/test/kotlin/com/wholeman/leapyear/GetDayTest.kt: -------------------------------------------------------------------------------- 1 | package com.wholeman.leapyear 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | val daysOfEachMonth = arrayOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) 7 | val weeks = arrayOf("THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED") 8 | 9 | fun getDayOfTheWeek(month: Int, day: Int): String { 10 | return weeks[(getFirstDayOfMonth(month) - 1 + day) % 7] 11 | } 12 | 13 | fun getFirstDayOfMonth(month: Int): Int { 14 | return if (month == 1) 1 else 1 + daysOfEachMonth 15 | .sliceArray(0 until month - 1) 16 | .reduce { sum, days -> sum + days } 17 | } 18 | 19 | class GetDayTest { 20 | 21 | @Test 22 | fun getDayOfTheWeekTest() { 23 | assertThat(getDayOfTheWeek(5, 24)).isEqualTo("TUE") 24 | } 25 | 26 | @Test 27 | fun getFirstDayOfMonthTest() { 28 | assertThat(getFirstDayOfMonth(1)).isEqualTo(1) 29 | assertThat(getFirstDayOfMonth(2)).isEqualTo(32) 30 | assertThat(getFirstDayOfMonth(5)).isEqualTo(122) 31 | } 32 | } -------------------------------------------------------------------------------- /2016-hj-ys/2016.kt: -------------------------------------------------------------------------------- 1 | package com.hyejineee 2 | 3 | val startDayOfWeekOfYear = 5; 4 | val weekDays = arrayOf("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT") 5 | 6 | fun _2016(month: Int, day: Int): String { 7 | val days = getDaysIn2016(month, day) 8 | return weekDays[days % weekDays.size] 9 | } 10 | 11 | fun getDaysIn2016(month: Int, day: Int): Int { 12 | var sum = 0; 13 | for (i in 1..month - 1) { 14 | sum += getDaysOfMonth(i) 15 | } 16 | return startDayOfWeekOfYear + sum + day - 1 17 | } 18 | 19 | val isEven: (Int) -> Boolean = { it % 2 == 0 } 20 | 21 | val isOdd: (Int) -> Boolean = { it % 2 == 1 } 22 | 23 | fun getDaysOfMonth(month: Int): Int { 24 | if (month == 2) { 25 | return 29 26 | } 27 | val checker = if (month < 8) isEven else isOdd 28 | return if (checker(month)) 30 else 31 29 | } 30 | -------------------------------------------------------------------------------- /2016-hj-ys/2016Test.kt: -------------------------------------------------------------------------------- 1 | package `2016` 2 | import com.hyejineee.* 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | class `2016Test` { 7 | @Test 8 | fun _2016Test() { 9 | assertThat(_2016(1, 7)).isEqualTo("THU") 10 | assertThat(_2016(3, 1)).isEqualTo("TUE") 11 | assertThat(_2016(5, 24)).isEqualTo("TUE") 12 | assertThat(_2016(12, 30)).isEqualTo("FRI") 13 | } 14 | 15 | @Test 16 | fun getDaysOfMonthTest() { 17 | assertThat(getDaysOfMonth(1)).isEqualTo(31) 18 | assertThat(getDaysOfMonth(2)).isEqualTo(29) 19 | assertThat(getDaysOfMonth(3)).isEqualTo(31) 20 | assertThat(getDaysOfMonth(10)).isEqualTo(31) 21 | assertThat(getDaysOfMonth(11)).isEqualTo(30) 22 | } 23 | } -------------------------------------------------------------------------------- /2016-joker/dayname_test.py: -------------------------------------------------------------------------------- 1 | DAY_NAMES = 'SUN MON TUE WED THU FRI SAT'.split() 2 | DAYS = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 3 | 4 | 5 | def dayname(month, day): 6 | days = sum(DAYS[:month - 1]) + day 7 | return DAY_NAMES[(4 + days) % len(DAY_NAMES)] 8 | 9 | 10 | def test_sample(): 11 | assert dayname(1, 1) == 'FRI' 12 | assert dayname(2, 1) == 'MON' 13 | assert dayname(5, 24) == 'TUE' 14 | assert dayname(12, 25) == 'SUN' 15 | -------------------------------------------------------------------------------- /2016-ym-skc/2016-ym-skc_test.py: -------------------------------------------------------------------------------- 1 | DAYS_OF_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30] 2 | WEEKDAY_NAMES = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'] 3 | 4 | 5 | def solution(month, day): 6 | return get_weekday(sum_of_days(month) + day + WEEKDAY_NAMES.index('FRI') - 1) 7 | 8 | 9 | def sum_of_days(month): 10 | return sum(DAYS_OF_MONTH[:month]) 11 | 12 | 13 | def get_weekday(days): 14 | return WEEKDAY_NAMES[days % len(WEEKDAY_NAMES)] 15 | 16 | 17 | def test_solution(): 18 | assert solution(1, 1) == 'FRI' 19 | assert solution(5, 24) == 'TUE' 20 | assert solution(12, 25) == 'SUN' 21 | 22 | 23 | def test_sum_of_days_of_month(): 24 | assert sum_of_days(1) == 0 25 | assert sum_of_days(2) == 31 26 | assert sum_of_days(12) == 366 - 31 27 | 28 | 29 | def test_get_weekday(): 30 | assert get_weekday(5) == 'FRI' 31 | assert get_weekday(11) == 'THU' 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 코딩 도장 2 | 3 | ## 2019-10-15 (화) 4 | 5 | [완주하지 못한 선수](http://j.mp/2MAv6MY) 문제. 6 | 7 | `marathon-ㅇㅇㅇ` 8 | 9 | ## 2019-10-22 (화) 10 | 11 | [모의고사](http://j.mp/32EpBUb) 문제 12 | 13 | `mocktest-ㅇㅇㅇ` 14 | 15 | ## 2019-10-29 (화) 16 | 17 | [체육복](http://j.mp/31YNLb9) 문제 18 | 19 | `peuniforms-ㅇㅇㅇ` 20 | 21 | ## 2019-11-05 (화) 22 | 23 | [K번째수](http://j.mp/2NH7GpS) 문제 24 | 25 | `knumber-ㅇㅇㅇ` 26 | 27 | ## 2019-11-12 (화) 28 | 29 | [2016년](http://j.mp/2X44iJX) 문제 30 | 31 | `2016-ㅇㅇㅇ` 32 | 33 | ## 2019-11-19 (화) 34 | 35 | [같은 숫자는 싫어](http://j.mp/37ssKcO) 문제 36 | 37 | `norepeat-ㅇㅇㅇ` 38 | 39 | ## 2019-11-26 (화) 40 | 41 | [나누어 떨어지는 숫자 배열](http://j.mp/2XRFe9c) 문제 42 | 43 | `divisor-ㅇㅇㅇ` 44 | 45 | ## 2019-12-03 (화) 46 | 47 | [다트 게임](http://j.mp/2DNnp1Z) 문제 48 | 49 | `dart-ㅇㅇㅇ` 50 | 51 | ## 2019-12-10 (화) 52 | 53 | [실패율](http://j.mp/2P9jjaM) 문제 54 | 55 | `failurerate-ㅇㅇㅇ` 56 | 57 | ## 2019-12-17 (화) 58 | 59 | [예산](http://j.mp/2Z6Lvih) 문제 60 | 61 | `budget-ㅇㅇㅇ` 62 | 63 | ## 2020-01-07 (화) 64 | 65 | [스킬트리](http://j.mp/2vu0JmC) 문제 66 | 67 | `skilltree-ㅇㅇㅇ` 68 | 69 | ## 2020-01-14 (화) 70 | 71 | [소수 만들기](http://j.mp/2U2ww8r) 문제 72 | 73 | `primenumbers-ㅇㅇㅇ` 74 | 75 | ## 2020-01-21 (화) 76 | 77 | [쇠막대기](http://j.mp/2U2J9QN) 문제 78 | 79 | `ironstick-ㅇㅇㅇ` 80 | 81 | ## 2020-01-28 (화) 82 | 83 | [전화번호 목록](http://j.mp/2U72ccH) 문제 84 | 85 | `phonenumbers-ㅇㅇㅇ` 86 | 87 | ## 2020-02-07 (화) 88 | 89 | [짝지어 제거하기](http://j.mp/2ShXTKd) 문제 90 | 91 | `deletepairs-ㅇㅇㅇ` 92 | 93 | ## 2020-02-11 (화) 94 | 95 | [다리를 지나는 트럭](http://j.mp/2tSBYjC) 문제 96 | 97 | `trucks-ㅇㅇㅇ` 98 | 99 | ## 2020-02-18 (화) 100 | 101 | [오픈채팅방](https://j.mp/3nB7aNu) 문제 102 | 103 | `openchat-ㅇㅇㅇ` 104 | -------------------------------------------------------------------------------- /budget-csh-lyh/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | .idea 8 | -------------------------------------------------------------------------------- /budget-csh-lyh/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM. 9 | id("org.jetbrains.kotlin.jvm").version("1.3.20") 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving your dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Use the Kotlin JDK 8 standard library. 23 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 24 | 25 | // Use the Kotlin test library. 26 | testImplementation("org.jetbrains.kotlin:kotlin-test") 27 | 28 | // Use the Kotlin JUnit integration. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 30 | 31 | testImplementation("org.assertj:assertj-core:3.11.1") 32 | } 33 | 34 | application { 35 | // Define the main class for the application. 36 | mainClassName = "com.codingdojo.budget.AppKt" 37 | } 38 | -------------------------------------------------------------------------------- /budget-csh-lyh/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/budget-csh-lyh/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /budget-csh-lyh/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /budget-csh-lyh/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS='"-Xmx64m"' 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /budget-csh-lyh/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /budget-csh-lyh/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.2/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "budget-csh-lyh" 11 | -------------------------------------------------------------------------------- /budget-csh-lyh/src/test/kotlin/com/codingdojo/budget/SolutionTest.kt: -------------------------------------------------------------------------------- 1 | package com.codingdojo.budget 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | /** 7 | * Created by wholeman on 17/12/2019 8 | * Github : http://github.com/wholemann 9 | * E-Mail : wholeman.dev@gmail.com 10 | */ 11 | 12 | fun solution(d: List, budget: Int): Int = step(d.sorted(), d.sum() - budget) 13 | 14 | tailrec fun step(d: List, gap: Int): Int = when { 15 | gap <= 0 -> d.size 16 | else -> step(d.dropLast(1), gap - d.last()) 17 | } 18 | 19 | class SolutionTest { 20 | 21 | @Test 22 | fun `it returns maximum supportable department count`() { 23 | assertThat(solution(listOf(1, 3, 2, 5, 4), 9)).isEqualTo(3) 24 | assertThat(solution(listOf(1, 4, 2, 4, 3), 10)).isEqualTo(4) 25 | assertThat(solution(listOf(2, 2, 3, 3), 10)).isEqualTo(4) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /budget-hys-hhj/Budget.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.budget 2 | 3 | fun budget( 4 | departmentBudgets: Array, 5 | index: Int, 6 | sum: Int, 7 | budget: Int 8 | ): Int = 9 | when { 10 | index == departmentBudgets.size - 1 -> index + 1 11 | sum + departmentBudgets[index] > budget -> index 12 | else -> budget( 13 | departmentBudgets, index + 1, sum + departmentBudgets[index], budget 14 | ) 15 | } 16 | 17 | fun maxDepartmentsCount(departmentBudgets: Array, budget: Int): Int { 18 | return budget(departmentBudgets.sorted().toTypedArray(), 0, 0, budget) 19 | } 20 | -------------------------------------------------------------------------------- /budget-hys-hhj/BudgetTest.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.budget 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | internal class BudgetKtTest { 7 | @Test 8 | fun maxDepartmentsCount() { 9 | assertThat(maxDepartmentsCount(arrayOf(1, 3, 2, 5, 4), 9)).isEqualTo(3) 10 | assertThat(maxDepartmentsCount(arrayOf(2, 2, 3, 3), 10)).isEqualTo(4) 11 | } 12 | } -------------------------------------------------------------------------------- /budget-joker/budge_test.py: -------------------------------------------------------------------------------- 1 | def solution(costs, budget): 2 | xs = sorted(costs) 3 | return sum(sum(xs[:i + 1]) <= budget for i in range(len(xs))) 4 | 5 | 6 | def test_solution(): 7 | assert solution([1, 3, 2, 5, 4], 9) == 3 8 | assert solution([2, 2, 3, 3], 10) == 4 9 | -------------------------------------------------------------------------------- /budget-skc-kyh/README.md: -------------------------------------------------------------------------------- 1 | 2 | 1. 조건 3 | 입력은 각 부서의 예산신청금액의 배열(d)과 총 예산금액(budget) 4 | 예산에 맞게 가장 많이 지원해 줄 수 있는 부서의 개수를 구하라. 5 | 6 | * 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없다. 7 | * d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다. 8 | * d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다. 9 | * budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다. 10 | 11 | 2. 계획 12 | 1. d배열을 오름차순으로 정렬 13 | 2. d배열을 loop을 돌면서 총 예산금액에서 빼준다. 14 | 3. 그 다음 신청금액이 남은 예산보다 크면 현재 index를 반환한다. 15 | 16 | 3. 실행 17 | 18 | 4. 회고 19 | -------------------------------------------------------------------------------- /budget-skc-kyh/budget-skc-kyh.test.js: -------------------------------------------------------------------------------- 1 | const solution = (d, budget) => { 2 | return getNumberOfDepartment(sortByAscending(d), budget); 3 | }; 4 | 5 | const sortByAscending = array => { 6 | return array.sort((a, b) => a - b); 7 | }; 8 | 9 | const getNumberOfDepartment = (sortedArray, budget) => { 10 | let remainedBudget = budget; 11 | for (let i = 0; i < sortedArray.length; i++) { 12 | remainedBudget -= sortedArray[i]; 13 | if (remainedBudget < 0) { 14 | return i; 15 | } 16 | } 17 | return sortedArray.length; 18 | }; 19 | 20 | test("solution", () => { 21 | expect(solution([1, 3, 2, 5, 4], 9)).toBe(3); 22 | expect(solution([2, 2, 3, 3], 9)).toBe(3); 23 | expect(solution([2, 2, 3, 3], 10)).toBe(4); 24 | }); 25 | 26 | test("sortByAscending", () => { 27 | expect(sortByAscending([1, 3, 2, 5, 4])).toEqual([1, 2, 3, 4, 5]); 28 | expect(sortByAscending([14, 3, 0, 5, -4])).toEqual([-4, 0, 3, 5, 14]); 29 | }); 30 | 31 | test("getNumberOfDepartment", () => { 32 | expect(getNumberOfDepartment([1, 2, 3, 4, 5], 9)).toBe(3); 33 | expect(getNumberOfDepartment([1, 2, 3, 4, 5], 10)).toBe(4); 34 | expect(getNumberOfDepartment(sortByAscending([2, 2, 3, 3]), 10)).toBe(4); 35 | }); 36 | -------------------------------------------------------------------------------- /budget-young-and-old/budget.ex: -------------------------------------------------------------------------------- 1 | ExUnit.start 2 | 3 | defmodule Budget do 4 | def max_number_of_department_we_can_support(total_budget, request_from_departments) do 5 | func_x(total_budget, Enum.sort(request_from_departments), 0) 6 | end 7 | 8 | def func_x(current_budget, [head], number_of_department) when current_budget >= head do 9 | number_of_department + 1 10 | end 11 | 12 | def func_x(_, [_], number_of_department) do 13 | number_of_department 14 | end 15 | 16 | def func_x(current_budget, [head | _], number_of_department) when current_budget < head do 17 | number_of_department 18 | end 19 | 20 | def func_x(current_budget, [head | tail], number_of_department) do 21 | func_x(current_budget - head, tail, number_of_department + 1) 22 | end 23 | end 24 | 25 | defmodule BudgetTest do 26 | use ExUnit.Case 27 | 28 | test "find max number of department we can support" do 29 | assert Budget.max_number_of_department_we_can_support(9, [1,3,2,5,4]) == 3 30 | assert Budget.max_number_of_department_we_can_support(9, [5,3,2,1,4]) == 3 31 | assert Budget.max_number_of_department_we_can_support(10, [2,2,3,3]) == 4 32 | 33 | assert Budget.max_number_of_department_we_can_support(1, [1]) == 1 34 | assert Budget.max_number_of_department_we_can_support(1, [1, 2]) == 1 35 | end 36 | 37 | test "inner loop" do 38 | assert Budget.func_x(0, [1, 2], 0) == 0 39 | assert Budget.func_x(1, [1, 2], 0) == 1 40 | assert Budget.func_x(3, [1, 2], 0) == 2 41 | assert Budget.func_x(1, [1], 0) == 1 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /dart-jbj-lyh/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/dart-jbj-lyh/README.md -------------------------------------------------------------------------------- /dart-jbj-lyh/dart.test.js: -------------------------------------------------------------------------------- 1 | /* 2 | 계획. 3 | - 1.기록된 점수(dartResult)를 받아서, 단계별로 분류한다. 4 | - 2.보너스를 적용한다. 5 | - 3.옵션을 확인한다. 6 | - 있을 경우 7 | - 스타상 8 | - 일단계 : 현재 단계에만 2배를 적용한다. 9 | - 그외 : 현재 단계와 앞단계에만 2배를 적용한다. 10 | - 아차상 11 | - 현재 단계의 값을 음수로 만들어준다. 12 | - 없을 경우 13 | - 4.전체 총합을 구한다. 14 | */ 15 | const getSumOfDartPoint = (dartResult) => getAppliedOption(getDeivdedStage(dartResult) 16 | .map((v) => getAppliedBonus(v))). 17 | reduce((acc, cur) => acc+cur, 0); 18 | 19 | 20 | const getDeivdedStage = (dartResult) => { 21 | const stages = []; 22 | const dartResultArray = dartResult.split(''); 23 | const bonusIndexList = []; 24 | 25 | 26 | 27 | dartResultArray.forEach((v, i) => { 28 | if (v==='S' || v==='D' ||v ==='T') { 29 | bonusIndexList.push(i); 30 | } 31 | }) 32 | 33 | 34 | bonusIndexList.forEach((v, i) => { 35 | const stage = []; 36 | 37 | // 점수가 10 일 경우와 0 일 경우가 있으므로, 구분. 38 | if(dartResultArray[v-1] == 0 ){ 39 | //여기서 0일 경우 바로 옆에 1이 존재하는지 확인부터 한다. 40 | if(dartResultArray[v-2] ==1){ 41 | stage.push(10) 42 | }else{ 43 | stage.push(0); 44 | } 45 | 46 | }else{ 47 | stage.push(parseInt(dartResultArray[v-1])) 48 | } 49 | 50 | // 보너스 51 | stage.push(dartResultArray[v]); 52 | 53 | 54 | // 옵션 55 | if(dartResultArray[v+1]==='*' || dartResultArray[v+1]==='#'){ 56 | stage.push(dartResultArray[v+1]); 57 | } else { 58 | stage.push(null); 59 | } 60 | 61 | stages.push(stage); 62 | }); 63 | 64 | return stages; 65 | } 66 | 67 | const getAppliedBonus = (stage) => { 68 | 69 | const result = []; 70 | 71 | if (stage[1] === 'S') { 72 | result.push(stage[0],stage[2]); 73 | }else if (stage[1] === 'D') { 74 | result.push(stage[0] * stage[0],stage[2]); 75 | }else if (stage[1] === 'T') { 76 | result.push(stage[0] * stage[0] * stage[0],stage[2]); 77 | } 78 | 79 | return result; 80 | } 81 | 82 | const getAppliedOption = (stage) => { 83 | 84 | const result = []; 85 | 86 | stage.forEach((v, i) => { 87 | if (v[1] === '*') { 88 | if (i == 0) { 89 | result.push(v[0] * 2); 90 | } else { 91 | result[i-1] = result[i-1] * 2; 92 | result.push(v[0] * 2); 93 | } 94 | } else if (v[1] === '#') { 95 | result.push(v[0]* -1); 96 | }else{ 97 | result.push(v[0]); 98 | } 99 | }); 100 | 101 | return result; 102 | } 103 | 104 | test('getSumOfDartPoint', () => { 105 | expect(getSumOfDartPoint('1S2D*3T')).toBe(37); 106 | expect(getSumOfDartPoint('1D2S#10S')).toBe(9); 107 | expect(getSumOfDartPoint('1D2S0T')).toBe(3); 108 | expect(getSumOfDartPoint('1S*2T*3S')).toBe(23); 109 | expect(getSumOfDartPoint('1D#2S*3S')).toBe(5); 110 | expect(getSumOfDartPoint('1T2D3D#')).toBe(-4); 111 | expect(getSumOfDartPoint('1D2S3T*')).toBe(59); 112 | }) 113 | 114 | test('getDeivdedStage', () => { 115 | expect(getDeivdedStage('1S2D*3T')).toEqual([[1,"S",null], [2, "D", "*"], [3, "T", null]]); 116 | expect(getDeivdedStage('1D2S#10S')).toEqual([[1,"D",null], [2, "S", "#"], [10, "S", null]]); 117 | }) 118 | 119 | test('getAppliedBonus', () => { 120 | expect(getAppliedBonus([1, 'S', null])).toEqual([1, null]); 121 | }) 122 | 123 | test('getAppliedOption', () => { 124 | expect(getAppliedOption([[1, null], [4, '*'], [27, null]])).toEqual([2,8,27]); 125 | expect(getAppliedOption([[4, '*']])).toEqual([8]); 126 | }) 127 | -------------------------------------------------------------------------------- /dart-jbj-lyh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dart-jbj-lyh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dart-jjc-sk/dart_test.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def solution(dart_result): 5 | return sum(map(score, dart_to_hits((dart_result)))) 6 | 7 | 8 | def score(hit): 9 | return hit[0] ** hit[1] * hit[2] 10 | 11 | 12 | def dart_to_hits(dart_result): 13 | tokens = re.findall('([0-9]+)([SDT])([*#]?)', dart_result) 14 | hits = [] 15 | for number, power, option in tokens: 16 | coefficient = {'': 1, '*': 2, '#': -1}[option] 17 | if hits and option == '*': 18 | last_token = hits.pop() 19 | hits.append(last_token[:2] + (last_token[-1] * 2,)) 20 | hits.append((int(number), 'SDT'.index(power) + 1, coefficient)) 21 | return hits 22 | 23 | 24 | def test_solution(): 25 | assert solution('1D2S0T') == 3 26 | assert solution('1S2D*3T') == 37 27 | assert solution('1D2S#10S') == 9 28 | assert solution('1S*2T*3S') == 23 29 | assert solution('1D#2S*3S') == 5 30 | assert solution('1T2D3D#') == -4 31 | assert solution('1D2S3T*') == 59 32 | 33 | 34 | def test_score(): 35 | assert score((1, 2, 1)) == 1 36 | assert score((2, 2, 2)) == 8 37 | assert score((0, 3, 1)) == 0 38 | 39 | 40 | def test_tokens_to_hits(): 41 | assert dart_to_hits('1D2S0T') == [(1, 2, 1), (2, 1, 1), (0, 3, 1)] 42 | assert dart_to_hits('1D*2S#0T') == [(1, 2, 2), (2, 1, -1), (0, 3, 1)] 43 | assert dart_to_hits('1S2D*3T') == [(1, 1, 2), (2, 2, 2), (3, 3, 1)] 44 | -------------------------------------------------------------------------------- /dart-joker/.nvmrc: -------------------------------------------------------------------------------- 1 | v12.4.0 2 | -------------------------------------------------------------------------------- /dart-joker/dart.test.js: -------------------------------------------------------------------------------- 1 | // Node.js 12+ 2 | 3 | const total_score1 = text => 4 | [...text.matchAll(/(\d+)([SDT]+)([*#]?)/g)].reduce((acc, [_, ...x]) => ( 5 | last(x) === '*' 6 | ? [...head(acc), last(acc) * 2, score(x) * 2] : [...acc, score(x)] 7 | ), []).filter(Number.isInteger).reduce((a, b) => a + b); 8 | 9 | const score = ([a, b, c]) => (+a) ** ' SDT'.indexOf(b) * (c === '#' ? -1 : 1); 10 | 11 | const head = xs => xs.slice(0, -1); 12 | const last = xs => xs.slice(-1)[0]; 13 | 14 | // old Node.js 15 | 16 | const total_score2 = text => 17 | [...matchAll(text, /(\d+)([SDT]+)([*#]?)/)].reduce((acc, [_, ...x]) => ( 18 | last(x) === '*' 19 | ? [...head(acc), last(acc) * 2, score(x) * 2] : [...acc, score(x)] 20 | ), []).filter(Number.isInteger).reduce((a, b) => a + b); 21 | 22 | const matchAll = (text, pattern) => 23 | [...text.match(RegExp(pattern, 'g'))].map(i => i.match(pattern)); 24 | 25 | // Test ----------------------------------------------------- 26 | 27 | test('sample', () => { 28 | [total_score1, total_score2].forEach(total_score => { 29 | expect(total_score('1S2D*3T')).toBe(37); 30 | expect(total_score('1D2S#10S')).toBe(9); 31 | expect(total_score('1D2S0T')).toBe(3); 32 | expect(total_score('1S*2T*3S')).toBe(23); 33 | expect(total_score('1D#2S*3S')).toBe(5); 34 | expect(total_score('1T2D3D#')).toBe(-4); 35 | expect(total_score('1D2S3T*')).toBe(59); 36 | }); 37 | }); 38 | -------------------------------------------------------------------------------- /dart-joker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dart", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "jest": "^27.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dart-mgh-hys-hhj/DartGame.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.app 2 | 3 | import kotlin.math.pow 4 | 5 | fun calculateScore(dartResult: String): Int { 6 | val results = splitResult(dartResult) 7 | return calculate(results) 8 | } 9 | 10 | fun splitResult(dartResult: String): Array = 11 | dartResult.fold(Pair(emptyArray(), "")) { (parts, temp), c -> 12 | if ("SDT*#".contains(c)) { 13 | Pair(parts + arrayOf(temp + c), "") 14 | } else { 15 | Pair(parts, temp + c) 16 | } 17 | }.first 18 | 19 | fun calculate(results: Array): Int = 20 | results.fold(emptyList()) { scores, part -> 21 | when (part) { 22 | "*" -> scores.dropLast(2) + scores.takeLast(2).map { it * 2 } 23 | "#" -> scores.dropLast(1) + scores.takeLast(1).map { it * -1 } 24 | else -> { 25 | val c = part.last() 26 | val number = part.substringBeforeLast(c).toDouble() 27 | val score = number.pow("SDT".indexOf(c) + 1).toInt() 28 | scores.plus(score) 29 | } 30 | } 31 | }.sum() 32 | -------------------------------------------------------------------------------- /dart-mgh-hys-hhj/DartGameTest.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.app 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | internal class DartGameTest { 7 | @Test 8 | fun `Calculate score of dart result`() { 9 | assertThat(calculateScore("1S2D*3T")).isEqualTo(37) 10 | assertThat(calculateScore("1D2S#10S")).isEqualTo(9) 11 | assertThat(calculateScore("1D2S0T")).isEqualTo(3) 12 | assertThat(calculateScore("1S*2T*3S")).isEqualTo(23) 13 | assertThat(calculateScore("1D#2S*3S")).isEqualTo(5) 14 | assertThat(calculateScore("1T2D3D#")).isEqualTo(-4) 15 | assertThat(calculateScore("1D2S3T*")).isEqualTo(59) 16 | } 17 | 18 | @Test 19 | fun `Split dart result`() { 20 | assertThat(splitResult("1S2D*3T")).isEqualTo(arrayOf("1S", "2D", "*", "3T")) 21 | assertThat(splitResult("1D#2S*3S")).isEqualTo(arrayOf("1D", "#", "2S", "*", "3S")) 22 | } 23 | 24 | 25 | @Test 26 | fun `Calculate split dart results`() { 27 | assertThat(calculate(arrayOf("1S", "2D", "*", "3T"))).isEqualTo(37) 28 | assertThat(calculate(arrayOf("1D", "#", "2S", "*", "3S"))).isEqualTo(5) 29 | } 30 | } 31 | 32 | // 계획: 33 | // 1. 문자열을 쪼개자 34 | // 다음 숫자가 나오기 전까지 35 | // 1S2D*3T => ['1S', '2D', '*', '3T'] 36 | // 반복문으로 하나하나 체크하면서 쪼갠다. 37 | // 2. ['1S', '2D', '*', '3T'] => [1^1, 2^2, '*', 3^3] => [1, 4, '*', 27] => [1 * 2, 4 * 2, 27] 38 | // fun run(char) { 39 | // '10D' 40 | // 맨뒤에 캐릭터를 자른다. 41 | // 숫자를 뽑는다. 42 | // return Math.sqrt(숫자, map[캐릭터]) 43 | // } 44 | // 3. [1 * 2, 4 * 2, 27] 45 | // 4. sum([1 * 2, 4 * 2, 27]) 46 | 47 | // 우리가 원하는 것: 48 | // 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작 성하라. 49 | // 50 | // *는 해당 점수와 바로 전에 얻은 점수를 2배로 만든다. 51 | // #은 해당 점수는 마이너스 된다. 52 | // S 1제곱, D는 2제곱, T는 3제곱 53 | // 숫자 다음에는 문자가 온다(S, D, T) 54 | // 타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다. 55 | // 56 | // map[string]int { 57 | // "S": 1, 58 | // "D": 2, 59 | // "T": 3 60 | // } 61 | -------------------------------------------------------------------------------- /dart-skc-csh/README.MD: -------------------------------------------------------------------------------- 1 | ## 1. 이해 2 | 3 | 1. 다트 게임은 총 3번의 기회로 구성된다. 4 | 2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다. 5 | 3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다. 6 | 4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다. 7 | 5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고) 8 | 6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고) 9 | 7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고) 10 | 8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다. 11 | 9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다. 12 | 13 | 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라. 14 | 15 | answer의 길이는 무조건 3. 16 | 17 | ## 2. 계획 18 | 19 | 1. 문자열을 읽어서 S, D, T에서 끊는다. 20 | 2. 첫번째 끊은 단위에서 배열의 첫번째 index에 score를 규칙에 따라 계산하여 넣는다. ex) 1S = [1*1,] 21 | 3. 만약 그 다음 문자에서 옵션(* or #)이 나타난다면 규칙에 따라 적용한다. 22 | 4. 근데 * or #은 있을 수도 없을 수도 있다. 23 | 24 | ## 3. 실행 25 | 26 | ## 4. 반성 -------------------------------------------------------------------------------- /dart-skc-csh/dart.test.js: -------------------------------------------------------------------------------- 1 | const getSumOfScore = (dartResult) => { 2 | return calcByRule(parseDartResult(dartResult)); 3 | }; 4 | 5 | const parseDartResult = (dartResult) => { 6 | const result = []; 7 | let prevIndex = 0; 8 | for (let i = 0; i < dartResult.length; i++) { 9 | let value = dartResult[i]; 10 | if (value === 'S' || value === 'D' || value === 'T') { 11 | if (dartResult[i+1] === '*' || dartResult[i+1] === '#') { 12 | result.push(dartResult.slice(prevIndex, i+2)); 13 | prevIndex = i+2; 14 | } else { 15 | result.push(dartResult.slice(prevIndex, i+1)); 16 | prevIndex = i+1; 17 | } 18 | } 19 | } 20 | return result; 21 | }; 22 | 23 | const calcByRule = (slicedArray) => { 24 | const result = []; 25 | slicedArray.forEach((cur, index) => { 26 | let number = 0 27 | let temp = 0; 28 | if (cur.includes('S')) { 29 | number = cur.split('S')[0]; 30 | temp = number * 1; 31 | } else if (cur.includes('D')) { 32 | number = cur.split('D')[0]; 33 | temp = (number * number); 34 | } else if (cur.includes('T')) { 35 | number = cur.split('T')[0]; 36 | temp = (number * number * number); 37 | } 38 | result.push(temp); 39 | if (cur.includes('*')) { 40 | result[index - 1] = result[index -1] * 2; 41 | result[index] = result[index] * 2 42 | } 43 | if (cur.includes('#')) { 44 | result[index] = result[index] * (-1); 45 | } 46 | }); 47 | return result.reduce((acc, cur) => { 48 | acc += cur; 49 | return acc; 50 | }, 0); 51 | }; 52 | 53 | test('getSumOfScore', () => { 54 | expect(getSumOfScore('1S2D*3T')).toBe(37); 55 | expect(getSumOfScore('1D2S#10S')).toBe(9); 56 | expect(getSumOfScore('1D2S0T')).toBe(3); 57 | expect(getSumOfScore('1S*2T*3S')).toBe(23); 58 | expect(getSumOfScore('1D#2S*3S')).toBe(5); 59 | expect(getSumOfScore('1T2D3D#')).toBe(-4); 60 | expect(getSumOfScore('1D2S3T* ')).toBe(59); 61 | }); 62 | 63 | test('parseDartResult', () => { 64 | expect(parseDartResult('1S2D*3T')).toEqual(['1S', '2D*', '3T']); 65 | }); 66 | 67 | test('calcByRule', () => { 68 | // expect(calcByRule(['1S', '*2D', '*3T'])).toBe(37); 69 | // expect(calcByRule(['1S', '2D', '3T'])).toBe(32); 70 | }) -------------------------------------------------------------------------------- /dart-skc-csh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dart-skc-csh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /deletepairs-cena-kyh-khj/deletepairs.test.js: -------------------------------------------------------------------------------- 1 | // 입력값: string 2 | // 출력값: 1 or 0 3 | 4 | // for문을 돌면서 다음 인덱스값이랑 본인값이 같으면 제거 5 | // 같지 않으면 패스 6 | 7 | const solution = pairString => { 8 | let before = pairString; 9 | while (1) { 10 | const after = before.length; 11 | before = getRestPairString(before); 12 | if (!before) { 13 | return 1; 14 | } 15 | 16 | if (before.length === after) { 17 | return 0; 18 | } 19 | } 20 | }; 21 | 22 | const getRestPairString = pairString => { 23 | for (let i = 0; i < pairString.length - 1; i++) { 24 | if (pairString[i] === pairString[i + 1]) { 25 | return pairString.replace(pairString[i] + pairString[i + 1], ""); 26 | } 27 | } 28 | return pairString; 29 | }; 30 | 31 | test("입력값에 대해서 for문을 돌면서 다음 인덱스 값이랑 본인 값이 같으면 제거한다", () => { 32 | expect(solution("baabaa")).toBe(1); 33 | expect(solution("cdcd")).toBe(0); 34 | expect(solution("aaaaa")).toBe(0); 35 | expect(solution("aaaaaa")).toBe(1); 36 | expect(solution("baaaaab")).toBe(0); 37 | }); 38 | 39 | test("string에서 짝을 찾아 제거한 후의 반환 값은 스페이스가 없는 string이다.", () => { 40 | expect(getRestPairString("baabaa")).toBe("bbaa"); 41 | expect(getRestPairString("bbaa")).toBe("aa"); 42 | expect(getRestPairString("aa")).toBe(""); 43 | expect(getRestPairString("cdcd")).toBe("cdcd"); 44 | expect(getRestPairString("aaaaa")).toBe("aaa"); 45 | expect(getRestPairString("aaa")).toBe("a"); 46 | expect(getRestPairString("a")).toBe("a"); 47 | }); 48 | 49 | const getAlpabetList = pairString => { 50 | const result = new Set(pairString); 51 | return [...result].sort(); 52 | }; 53 | 54 | test("중복없는 알파벳 뽑기", () => { 55 | expect(getAlpabetList("abbb")).toEqual(["a", "b"]); 56 | expect(getAlpabetList("abbabb")).toEqual(["a", "b"]); 57 | expect(getAlpabetList("cdcd")).toEqual(["c", "d"]); 58 | }); 59 | -------------------------------------------------------------------------------- /deletepairs-cena-kyh-khj/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deletepairs-cena-kyh-khj", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /deletepairs-cena/deletepairs.test.js: -------------------------------------------------------------------------------- 1 | const solution = text => { 2 | const pair = findPair(text); 3 | if (pair == "") return (!text && 1) || 0; 4 | const pattern = new RegExp(`(${pair})`, "g"); 5 | return solution(text.replace(pattern, "")); 6 | }; 7 | 8 | const stackSolution = text => { 9 | const stack = []; 10 | for (let i = 0; i < text.length; i++) { 11 | if (stack[stack.length - 1] == text[i]) { 12 | stack.pop(); 13 | } else { 14 | stack.push(text[i]); 15 | } 16 | } 17 | return (!stack.length && 1) || 0; 18 | }; 19 | 20 | const findPair = text => { 21 | for (let i = 0; i < text.length - 1; i++) { 22 | if (text[i] == text[i + 1]) { 23 | return text[i] + text[i + 1]; 24 | } 25 | } 26 | return ""; 27 | }; 28 | 29 | test("stack solution", () => { 30 | expect(stackSolution("abc")).toBe(0); 31 | expect(stackSolution("baabaa")).toBe(1); 32 | expect(stackSolution("ab")).toBe(0); 33 | expect(stackSolution("cdc")).toBe(0); 34 | expect(stackSolution("aaaaa")).toBe(0); 35 | }); 36 | 37 | test("solution", () => { 38 | expect(solution("baabaa")).toBe(1); 39 | expect(solution("cdcd")).toBe(0); 40 | expect(solution("abc")).toBe(0); 41 | expect(solution("k")).toBe(0); 42 | expect(solution("aaaaa")).toBe(0); 43 | expect(solution("aaaa")).toBe(1); 44 | expect(solution("baaaaab")).toBe(0); 45 | }); 46 | 47 | test("findPair", () => { 48 | expect(findPair("baabaa")).toBe("aa"); 49 | expect(findPair("babb")).toBe("bb"); 50 | expect(findPair("cdcd")).toBe(""); 51 | expect(findPair("")).toBe(""); 52 | expect(findPair("ab")).toBe(""); 53 | expect(findPair("aa")).toBe("aa"); 54 | }); 55 | -------------------------------------------------------------------------------- /deletepairs-cena/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deletepairs-cena", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /deletepairs-hhj-hys/delete-pair-hhj-hys.test.js: -------------------------------------------------------------------------------- 1 | const run = s => { 2 | const stack = []; 3 | 4 | for (let i = 0; i < s.length; i++) { 5 | if (stack[stack.length - 1] == s[i]) { 6 | stack.pop(); 7 | } else { 8 | stack.push(s[i]); 9 | } 10 | } 11 | 12 | return stack.length == 0 ? 1 : 0; 13 | }; 14 | 15 | test(`test`, () => { 16 | expect(run("baabaa")).toBe(1); 17 | expect(run("cdcd")).toBe(0); 18 | }); 19 | -------------------------------------------------------------------------------- /deletepairs-hhj-hys/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "delete-pair-hhj-hys-js", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "jest": "^27.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /deletepairs-hye-ksh/deleteparis-hye-ksh.py: -------------------------------------------------------------------------------- 1 | import re 2 | from string import ascii_lowercase 3 | 4 | PATTERN = re.compile('|'.join(i * 2 for i in ascii_lowercase)) 5 | 6 | 7 | def solution1(text): 8 | remain = text 9 | while True: 10 | pair = find_pair(remain) 11 | if not pair: 12 | break 13 | remain = remain.replace(pair, '') 14 | return not remain and 1 or 0 15 | 16 | 17 | def solution2(text): 18 | pair = find_pair(text) 19 | if not pair: 20 | return not text and 1 or 0 21 | return solution2(text.replace(pair, '')) 22 | 23 | 24 | def solution3(text): 25 | remain = PATTERN.sub('', text) 26 | if remain == text: 27 | return not text and 1 or 0 28 | return solution3(remain) 29 | 30 | 31 | def solution4(text): 32 | stack = [] 33 | for x in text: 34 | if stack and x == stack[-1]: 35 | stack.pop() 36 | continue 37 | stack.append(x) 38 | return not stack and 1 or 0 39 | 40 | 41 | def solution5(text): 42 | return not aux(text, '') and 1 or 0 43 | 44 | 45 | def aux(text, stack): 46 | if not text: 47 | return stack 48 | if text[0] == stack[-1:]: 49 | return aux(text[1:], stack[:-1]) 50 | return aux(text[1:], stack + text[0]) 51 | 52 | 53 | def find_pair(text): 54 | for i in range(len(text) - 1): 55 | if text[i] == text[i + 1]: 56 | return text[i:i + 2] 57 | return '' 58 | 59 | 60 | def test_sample(): 61 | for solution in [solution1, solution2, solution3, solution4, solution5]: 62 | assert solution('aabb') == 1 63 | assert solution('baabaa') == 1 64 | assert solution('cdcd') == 0 65 | assert solution('cbaabaac') == 1 66 | assert solution('abcdeedddcba') == 1 67 | 68 | 69 | def test_find_pair(): 70 | assert find_pair('a') == '' 71 | assert find_pair('aa') == 'aa' 72 | assert find_pair('bb') == 'bb' 73 | assert find_pair('baa') == 'aa' 74 | assert find_pair('bcaa') == 'aa' 75 | assert find_pair('cd') == '' 76 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | .idea/ 8 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/READEME.md: -------------------------------------------------------------------------------- 1 | # 해결법 2 | 1. 문자열의 길이 만큼 순회한다. 3 | 2. 현재 위치와 다음 위치의 문자를 비교한다. 4 | 2-1. 현재 위치와 다음 위치의 문자가 같으면 문자열에서 두 문자를 제거 후 현재 위치 이전으로 돌아간다. 5 | 2-2. 현재 위치와 다음 위치의 문자가 다르면 다음 위치로 이동해서 비교한다. 6 | 3. 문자열이 모두 제거되면 1을 반환한다. 7 | 4. 문자열의 마지막 위치까지 도달 후 문자열이 남아있으면 0을 반환한다. 8 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin. 9 | id("org.jetbrains.kotlin.jvm") version "1.3.41" 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Align versions of all Kotlin components 23 | implementation(platform("org.jetbrains.kotlin:kotlin-bom")) 24 | 25 | // Use the Kotlin JDK 8 standard library. 26 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 27 | 28 | // Use the Kotlin test library. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test") 30 | 31 | // Use the Kotlin JUnit integration. 32 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 33 | 34 | testImplementation("org.assertj:assertj-core:3.13.2") 35 | } 36 | 37 | application { 38 | // Define the main class for the application. 39 | mainClassName = "deletepairs.mgh.csh.lyh.AppKt" 40 | } 41 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/deletepairs-mgh-csh-lyh/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 34 | 35 | @rem Find java.exe 36 | if defined JAVA_HOME goto findJavaFromJavaHome 37 | 38 | set JAVA_EXE=java.exe 39 | %JAVA_EXE% -version >NUL 2>&1 40 | if "%ERRORLEVEL%" == "0" goto init 41 | 42 | echo. 43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 44 | echo. 45 | echo Please set the JAVA_HOME variable in your environment to match the 46 | echo location of your Java installation. 47 | 48 | goto fail 49 | 50 | :findJavaFromJavaHome 51 | set JAVA_HOME=%JAVA_HOME:"=% 52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 53 | 54 | if exist "%JAVA_EXE%" goto init 55 | 56 | echo. 57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 58 | echo. 59 | echo Please set the JAVA_HOME variable in your environment to match the 60 | echo location of your Java installation. 61 | 62 | goto fail 63 | 64 | :init 65 | @rem Get command-line arguments, handling Windows variants 66 | 67 | if not "%OS%" == "Windows_NT" goto win9xME_args 68 | 69 | :win9xME_args 70 | @rem Slurp the command line arguments. 71 | set CMD_LINE_ARGS= 72 | set _SKIP=2 73 | 74 | :win9xME_args_slurp 75 | if "x%~1" == "x" goto execute 76 | 77 | set CMD_LINE_ARGS=%* 78 | 79 | :execute 80 | @rem Setup the command line 81 | 82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 83 | 84 | @rem Execute Gradle 85 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 86 | 87 | :end 88 | @rem End local scope for the variables with windows NT shell 89 | if "%ERRORLEVEL%"=="0" goto mainEnd 90 | 91 | :fail 92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 93 | rem the _cmd.exe /c_ return code! 94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 95 | exit /b 1 96 | 97 | :mainEnd 98 | if "%OS%"=="Windows_NT" endlocal 99 | 100 | :omega 101 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/6.0.1/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "deletepairs-mgh-csh-lyh" 11 | -------------------------------------------------------------------------------- /deletepairs-mgh-csh-lyh/src/test/kotlin/deletepairs/mgh/csh/lyh/DeletePairsTest.kt: -------------------------------------------------------------------------------- 1 | package deletepairs.mgh.csh.lyh 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | /* 7 | * # 해결법 8 | 1. 문자열의 길이 만큼 순회한다. 9 | 2. 현재 위치와 다음 위치의 문자를 비교한다. 10 | 2-1. 현재 위치와 다음 위치의 문자가 같으면 문자열에서 두 문자를 제거 후 현재 위치 이전으로 돌아간다. 11 | 2-2. 현재 위치와 다음 위치의 문자가 다르면 다음 위치로 이동해서 비교한다. 12 | 3. 문자열이 모두 제거되면 1을 반환한다. 13 | 4. 문자열의 마지막 위치까지 도달 후 문자열이 남아있으면 0을 반환한다. 14 | * */ 15 | fun String.isEnd(index: Int) = length - 1 == index 16 | 17 | tailrec fun solution(s: String, index: Int): Int = 18 | when { 19 | s.isEmpty() -> 1 20 | s.isEnd(index) -> 0 21 | s[index] == s[index + 1] -> solution(s.replaceRange(index..index + 1, ""), if (index - 1 < 0) 0 else index - 1) 22 | else -> solution(s, index + 1) 23 | } 24 | 25 | internal class DeletePairsTest { 26 | @Test 27 | fun `Delete pairs`() { 28 | assertThat(solution("baabaa", 0)).isEqualTo(1) 29 | assertThat(solution("cdcd", 0)).isEqualTo(0) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /deletepairs-sm-j/delete-pair.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | 5 | int solution(string input) 6 | { 7 | int len = input.length(); 8 | for(int i = 0; i < len- 1 ;i++) { 9 | if( input[i] == input[i + 1]) { 10 | input.erase(i, 2); 11 | i -= 2; 12 | len -= 2; 13 | } 14 | } 15 | if ( len == 0 ) return 1; 16 | return 0; 17 | } 18 | 19 | int main(int argc, const char * argv[]) { 20 | cout << solution("baabaa")< \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS='"-Xmx64m"' 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /deletepairs-wholeman/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /deletepairs-wholeman/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.2/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "deletepairs-wholeman" 11 | -------------------------------------------------------------------------------- /deletepairs-wholeman/src/test/kotlin/com/wholeman/deletepairs/SolutionTest.kt: -------------------------------------------------------------------------------- 1 | package com.wholeman.deletepairs 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | fun solution1(s: String): Int { 7 | tailrec fun step(head: String, tail: String): Int = when { 8 | head.isBlank() -> 1 9 | tail.isBlank() -> 0 10 | head.lastOrNull() == tail.firstOrNull() -> step(head.dropLast(1), tail.drop(1)) 11 | else -> step(head + tail.firstOrNull(), tail.drop(1)) 12 | } 13 | 14 | return step(s.firstOrNull().toString(), s.drop(1)) 15 | } 16 | 17 | fun solution2(s: String) = if (s.fold("") { acc, c -> 18 | when (c) { 19 | acc.lastOrNull() -> acc.dropLast(1) 20 | else -> acc + c 21 | } 22 | }.isBlank()) 1 else 0 23 | 24 | class SolutionTest { 25 | 26 | @Test 27 | fun `Delete pairs of adjacent letters in given string`() { 28 | arrayOf(::solution1, ::solution2).forEach { solution -> 29 | assertThat(solution("a")).isEqualTo(0) 30 | assertThat(solution("baabaa")).isEqualTo(1) 31 | assertThat(solution("cdcd")).isEqualTo(0) 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /diviosr-lyr-hys/divisor.test.js: -------------------------------------------------------------------------------- 1 | const ascending = (a, b) => a - b; 2 | 3 | const dividedNumbers = (numbers, divisor) => { 4 | const result = [...numbers] 5 | .filter(element => element % divisor === 0) 6 | .sort(ascending); 7 | 8 | return result.length === 0 ? [-1] : result; 9 | }; 10 | 11 | test('dividedNumbers', () => { 12 | expect(dividedNumbers([5, 9, 7, 10], 5)).toEqual([5, 10]); 13 | expect(dividedNumbers([10, 5, 9, 7], 5)).toEqual([5, 10]); 14 | expect(dividedNumbers([1, 2, 3], 10)).toEqual([-1]); 15 | expect(dividedNumbers([2, 36, 1, 3], 1)).toEqual([1, 2, 3, 36]); 16 | }); 17 | 18 | test('ascending', () => { 19 | expect(ascending(3, 10) < 0).toBe(true); 20 | expect(ascending(10, 3) < 0).toBe(false); 21 | expect(ascending(10, 10) == 0).toBe(true); 22 | }); 23 | -------------------------------------------------------------------------------- /divisor-jbj-lkn/divisor.js: -------------------------------------------------------------------------------- 1 | function divideClear(a, b) { 2 | return a % b == 0 3 | } 4 | 5 | function divideClearList(a, b) { 6 | 7 | result = a.filter(element => divideClear(element, b)); 8 | return result; 9 | } 10 | 11 | function divideClearSortedList(a, b) { 12 | 13 | dividedClearList = divideClearList(a, b); 14 | 15 | if (dividedClearList.length == 0) { 16 | return [-1]; 17 | } 18 | 19 | return dividedClearList.sort(ascending); 20 | } 21 | 22 | module.exports = {divideClear, divideClearList, divideClearSortedList}; 23 | -------------------------------------------------------------------------------- /divisor-jbj-lkn/divisor.test.js: -------------------------------------------------------------------------------- 1 | const {divideClear, divideClearList, divideClearSortedList} = require('./divideClear'); 2 | 3 | test('나누어 떨어지지 않는 경우 테스트', () => { 4 | expect(divideClear(5, 3)).toBe(false); 5 | }); 6 | 7 | test('나누어 떨어지는 경우 테스트', () => { 8 | expect(divideClear(6, 3)).toBe(true); 9 | }); 10 | 11 | test('주어진 리스트에서 나누어 떨어지는 리스트를 반환하는 경우', () => { 12 | expect(divideClearList([5, 10, 15],5)).toEqual([5, 10, 15]); 13 | }); 14 | 15 | test('나누어 떨어지지 않는 수가 포함된 리스트에서 나누어 떨어지는 수가 포함된 수만 담은 리스트를 반환하는 경우', () => { 16 | expect(divideClearList([5, 10, 12],5)).toEqual([5, 10]); 17 | }); 18 | 19 | test('나누어 떨어지지 않는 수가 포함된 정렬되지 않은 리스트에서 나누어 떨어지는 수가 포함된 수만 담고 오름차순으로 정렬된 리스트를 반환하는 경우', () => { 20 | expect(divideClearSortedList([5, 12, 20, 10], 5)).toEqual([5, 10, 20]); 21 | }); 22 | 23 | test('나누어 떨어지지 않는 수를 담은 리스트에서 나누어 떨어지는 수가 하나도 없는 경우 -1만 담은 리스트를 반환하라', () => { 24 | expect(divideClearSortedList([98, 12, 23, 11], 5)).toEqual([-1]); 25 | }); 26 | -------------------------------------------------------------------------------- /divisor-joker/divisor_test.py: -------------------------------------------------------------------------------- 1 | def divided_numbers(numbers, divisor): 2 | return sorted(i for i in numbers if i % divisor == 0) or [-1] 3 | 4 | 5 | def test_sample(): 6 | assert divided_numbers([5, 9, 7, 10], 5) == [5, 10] 7 | assert divided_numbers([2, 36, 1, 3], 1) == [1, 2, 3, 36] 8 | assert divided_numbers([3, 2, 6], 10) == [-1] 9 | -------------------------------------------------------------------------------- /divisor-lyh-kmj/README.md: -------------------------------------------------------------------------------- 1 | # 문제 : 나누어 떨어지는 숫자 배열 2 | 3 | ## 1.이해 4 | - arr : 정수 element로 이루어진 배열. 5 | - divisor : 나눌 정수형 변수. 6 | - return : arr의 element를 divisor로 나눴을 때 나머지 값이 0인 element를 가진 배열 7 | - arr에 있는 모든 element를 divisor로 나누었을 때 나머지 값이 0인 element를 구하고 오름차순으로 정렬한다. 8 | - divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환한다. 9 | ## 2.설계 10 | - arr를 순회하면서 divisor로 나누었을 때 나머지 값이 0인 element를 return 배열에 담는다. 11 | - return 배열을 정렬한다. 12 | - 모두 순회한 후에, return 배열에 값이 존재하지 않는다면 -1을 입력한 후에 리턴 한다. 13 | ## 3.실행 14 | ## 4.회고 15 | - 다음부터는 코드를 변경하는 단계를 더 쪼개서 연습을 해야겠다. 16 | - 네이밍을 좀 더 의도를 들어낼 수 있도록. 17 | - 문제를 좀 더 자세히 읽어야겠다. 18 | - tdd를 좀 더 집중해서 연습해야겠다. 19 | 20 | -------------------------------------------------------------------------------- /divisor-lyh-kmj/dividedNumbers.test.js: -------------------------------------------------------------------------------- 1 | /* 2 | - arr를 순회하면서 divisor로 나누었을 때 나머지 값이 0인 element를 return 배열에 담는다. 3 | - return 배열을 정렬한다. 4 | - 모두 순회한 후에, return 배열에 값이 존재하지 않는다면 -1을 입력한 후에 리턴 한다. 5 | */ 6 | const dividedNumbers = (numbers, divisor) => { 7 | const xs = numbers.filter(number => number % divisor === 0); 8 | return xs.length === 0 ? [-1] : [...xs].sort((a, b) => a - b); 9 | 10 | } 11 | 12 | test('dividedNumbers',() => { 13 | expect(dividedNumbers([5, 9, 7, 10], 5)).toEqual([5, 10]); 14 | expect(dividedNumbers([2, 36,1, 3], 1)).toEqual([1, 2, 3, 36]); 15 | expect(dividedNumbers([2, 36,1, 3], 1)).toEqual([1, 2, 3, 36]); 16 | expect(dividedNumbers([2, 36,1, 3], 200)).toEqual([-1]); 17 | expect(dividedNumbers([3, 2, 6], 10)).toEqual([-1]); 18 | }); 19 | -------------------------------------------------------------------------------- /divisor-lyh-kmj/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "divisor-lyh-kmj", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /divisor-solution-skc/divisor-solution.test.js: -------------------------------------------------------------------------------- 1 | function solution1(arr, divisor) { 2 | let answer = []; 3 | for (let i = 0; i < arr.length; i++) { 4 | if (arr[i] % divisor === 0) { 5 | answer.push(arr[i]); 6 | } 7 | } 8 | if (answer.length === 0) { 9 | return [-1]; 10 | } 11 | return arraySorting(answer); 12 | } 13 | 14 | function solution2(arr, divisor) { 15 | const answer = arr.filter(value => value % divisor === 0); 16 | return answer.length > 0 ? arraySorting(answer) : [-1]; 17 | } 18 | 19 | function arraySorting(arr) { 20 | return arr.sort((a, b) => a - b); 21 | } 22 | 23 | test("solution", () => { 24 | [solution1, solution2].forEach(solution => { 25 | expect(solution([4, 3], 2)).toEqual([4]); 26 | expect(solution([5, 9, 7, 10], 5)).toEqual([5, 10]); 27 | expect(solution([2, 36, 1, 3], 1)).toEqual([1, 2, 3, 36]); 28 | expect(solution([3, 2, 6], 10)).toEqual([-1]); 29 | }); 30 | }); 31 | 32 | test("sorting", () => { 33 | expect(arraySorting([2, 36, 1, 3])).toEqual([1, 2, 3, 36]); 34 | expect(arraySorting([5, 4, 3, 2, 1])).toEqual([1, 2, 3, 4, 5]); 35 | }); 36 | -------------------------------------------------------------------------------- /failurerate-csh-kyh/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /failurerate-csh-kyh/failurerate.test.js: -------------------------------------------------------------------------------- 1 | const solution = (n, stages) => 2 | Array.from({ length: n }, (_, i) => i + 1) 3 | .map(stage => [stage, failureRates(stage, stages)]) 4 | .sort((a, b) => a[1]===b[1] ? a[0] - b[0] : b[1] - a[1]) 5 | .map(v => v[0]); 6 | 7 | const failureRates = (i, stages) => stages.filter(s => s === i).length / (stages.filter(s => s >= i).length || 1); 8 | 9 | test('solution', () => { 10 | expect(solution(5, [2, 1, 2, 6, 2, 4, 3, 3])).toEqual([3, 4, 2, 1, 5]); 11 | expect(solution(4, [4, 4, 4, 4, 4])).toEqual([4, 1, 2, 3]); 12 | expect(solution(5, [1, 1, 2, 3])).toEqual([3, 1, 2, 4, 5]); 13 | }); 14 | 15 | test('failureRates', () => { 16 | expect(failureRates(1, [1, 1, 2, 2, 3, 3])).toBe(2 / 6); 17 | expect(failureRates(4, [1, 1, 2, 2, 3, 3])).toBe(0 / 1); 18 | expect(failureRates(2, [1, 1, 2, 2, 3, 3])).toBe(2 / 4); 19 | }); 20 | -------------------------------------------------------------------------------- /failurerate-csh-kyh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "failurerate-csh-kyh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /failurerate-hhj-hys-mkh/Failure.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.failurerate 2 | 3 | fun failureRate(stagesCount: Int, stages: IntArray): IntArray { 4 | var usersCount = stages.size 5 | 6 | return (1..stagesCount).map { i -> 7 | if (usersCount == 0) { 8 | Pair(i, 0.0) 9 | } else { 10 | val usersCountInStage = stages.filter { it == i }.size 11 | usersCount -= usersCountInStage 12 | Pair(i, usersCountInStage / usersCount.toDouble()) 13 | } 14 | } 15 | .sortedByDescending { (_, failureRate) -> failureRate } 16 | .map { (stage) -> stage } 17 | .toIntArray() 18 | } 19 | -------------------------------------------------------------------------------- /failurerate-hhj-hys-mkh/FailureTest.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.failurerate 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | internal class FailureRateKtTest { 7 | @Test 8 | fun `실패율 구하기`() { 9 | assertThat(failureRate(5, intArrayOf(2, 1, 2, 6, 2, 4, 3, 3))) 10 | .isEqualTo(intArrayOf(3, 4, 2, 1, 5)) 11 | 12 | assertThat(failureRate(4, intArrayOf(4, 4, 4, 4, 4))) 13 | .isEqualTo(intArrayOf(4, 1, 2, 3)) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /failurerate-joker/failure_test.py: -------------------------------------------------------------------------------- 1 | from collections import Counter 2 | 3 | 4 | def solution(n, stages): 5 | c = Counter(stages) 6 | return sorted(range(1, n + 1), key=lambda x: -failure_rate(x, n, c)) 7 | 8 | 9 | def failure_rate(i, n, c): 10 | return c.get(i, 0) / (sum(c.get(i, 0) for i in range(i, n + 2)) or 1) 11 | 12 | 13 | def test_sample(): 14 | assert solution(5, [2, 1, 2, 6, 2, 4, 3, 3]) == [3, 4, 2, 1, 5] 15 | assert solution(4, [4, 4, 4, 4, 4]) == [4, 1, 2, 3] 16 | 17 | 18 | def test_failure_rate(): 19 | assert failure_rate(1, 3, Counter([1, 1, 2, 2, 3, 3])) == 2 / 6 20 | assert failure_rate(2, 3, Counter([1, 1, 2, 2, 3, 3])) == 2 / 4 21 | assert failure_rate(2, 3, Counter([1, 1, 2, 2, 3, 3, 4])) == 2 / 5 22 | assert failure_rate(1, 5, Counter([2, 1, 2, 6, 2, 4, 3, 3])) == 1 / 8 23 | assert failure_rate(3, 5, Counter([2, 1, 2, 6, 2, 4, 3, 3])) == 2 / 4 24 | assert failure_rate(4, 5, Counter([2, 1, 2, 6, 2, 4, 3, 3])) == 1 / 2 25 | -------------------------------------------------------------------------------- /failurerate-khj-psm/fail_rate_test.py: -------------------------------------------------------------------------------- 1 | def calc_fail_rate(stage, stages): 2 | try_players = len(list(filter(lambda x: (x >= stage), stages))) 3 | fail_players = stages.count(stage) 4 | return fail_players / (try_players or 1) 5 | 6 | 7 | def solution(n, stages): 8 | rates = {stage: calc_fail_rate(stage, stages) for stage in range(1, n + 1)} 9 | sorted_rates = sorted(rates.items(), key=last, reverse=True) 10 | return list(map(first, sorted_rates)) 11 | 12 | 13 | def first(xs): 14 | return xs[0] 15 | 16 | 17 | def last(xs): 18 | return xs[-1] 19 | 20 | 21 | def test_calc_fail_rate(): 22 | assert calc_fail_rate(1, [2, 1, 2, 6, 2, 4, 3, 3]) == 1 / 8 23 | assert calc_fail_rate(2, [2, 1, 2, 6, 2, 4, 3, 3]) == 3 / 7 24 | assert calc_fail_rate(3, [2, 1, 2, 6, 2, 4, 3, 3]) == 2 / 4 25 | assert calc_fail_rate(4, [2, 1, 2, 6, 2, 4, 3, 3]) == 1 / 2 26 | assert calc_fail_rate(5, [2, 1, 2, 6, 2, 4, 3, 3]) == 0 27 | assert calc_fail_rate(1, [4, 4, 4, 4, 4]) == 0 28 | assert calc_fail_rate(2, [4, 4, 4, 4, 4]) == 0 29 | assert calc_fail_rate(3, [4, 4, 4, 4, 4]) == 0 30 | assert calc_fail_rate(4, [4, 4, 4, 4, 4]) == 1 31 | 32 | 33 | def test_solution(): 34 | assert solution(5, [2, 1, 2, 6, 2, 4, 3, 3]) == [3, 4, 2, 1, 5] 35 | assert solution(4, [4, 4, 4, 4, 4]) == [4, 1, 2, 3] 36 | assert solution(1, [1, 1, 1]) == [1] 37 | assert solution(2, [1, 3, 1]) == [1, 2] 38 | assert solution(5, [1, 3, 1]) == [3, 1, 2, 4, 5] 39 | -------------------------------------------------------------------------------- /failurerate-skc-lyh/README.md: -------------------------------------------------------------------------------- 1 | # 제목 : 실패율 2 | 3 | 1. 이해 4 | - N : 스테이지의 개수 5 | - stages : 각 유저가 머물러 있는 스테이지의 배열. 6 | - 실패율이 높은 스테이지부터 내림차순으로 정렬한다. 7 | - 도달한 스테이지가 없으면 실패율은 0 8 | - 실패율이 같은 스테이지라면 작은 번호가 먼저 오도록 9 | 2. 계획 10 | - 각 스테이지의 실패율을 구한다. 11 | - 스테이지 번호와 실패율을 담은 객체를 배열에 담는다. 12 | - 실패율을 내림차순으로 정렬한다. 13 | - 실패율이 동일하다면 오름차순으로 정렬한다. 14 | 3. 실행 15 | 4. 회고 16 | - 이번에 내가 사용한 방법으로 for문을 사용하는 것 보다 Array.from() 을 사용하여 배열을 만들어 map을 사용하는 방법으로 풀이 하였다. 17 | - 멀티 소트가 필요해서 이걸 구현해야 하나 고민하고 있었는데, MDN에서 해당 기능을 찾아서 사용하였다. 18 | - 계획을 한 후에 내가 세운 계획대로 코드로 실행하기 위해 언어 자체에서 제공하는 기능이 존재하는지 확인을 먼저 하는게 좋을것 같다. 존재한다면 갖다 쓰고, 없다면 만들어야될지 결정을 한다. 19 | -------------------------------------------------------------------------------- /failurerate-skc-lyh/failureRate.test.js: -------------------------------------------------------------------------------- 1 | /* 2 | - 각 스테이지의 실패율을 구한다. 3 | - 스테이지 번호와 실패율을 담은 객체를 배열에 담는다. 4 | - 실패율을 내림차순으로 정렬한다. 5 | - 실패율이 동일하다면 오름차순으로 정렬한다. 6 | - for loop을 돌면서 다음 값이 같은지 확인하고 값이 같은 index를 찾아서 7 | */ 8 | const sortByDifficulty = (n, stages) => sortFailureRates(getFailureRates(n, stages)).map(v => v[0]) 9 | 10 | 11 | const getFailureRates = (n, stages) => { 12 | return Array.from({length: n}, (_, i) => i+1).map(stage => { 13 | const under = stages.filter((v) => v >= stage).length; 14 | const over = stages.filter((v) => v === stage).length; 15 | const failureRate = under === 0 ? 0 : over / under; 16 | return [stage, failureRate]; 17 | }); 18 | } 19 | 20 | const sortFailureRates = (failureRatesInStages) => failureRatesInStages.sort(sortPolicy); 21 | 22 | 23 | const sortPolicy = (a, b) => a[1]===b[1] ? a[0] - b[0] : b[1] - a[1]; 24 | 25 | test('sortByDifficulty', () => { 26 | expect(sortByDifficulty(5, [2, 1, 2, 6, 2, 4, 3, 3])).toEqual([3, 4, 2, 1, 5]); 27 | expect(sortByDifficulty(4, [4, 4, 4, 4, 4])).toEqual([4, 1, 2, 3]); 28 | }); 29 | 30 | test('getFailureRates', () => { 31 | expect(getFailureRates(3, [2, 1, 2])).toEqual([[1, 1 / 3], [2, 1], [3, 0]]); 32 | expect(getFailureRates(5, [2, 1, 2, 6, 2, 4, 3, 3])).toEqual([[1, 1 / 8], [2, 3 / 7], [3, 2 / 4], [4, 1 / 2], [5, 0]]); 33 | }); 34 | 35 | test('sortFailureRates', () => { 36 | expect(sortFailureRates([[1, 1 / 3], [2, 1], [3, 0]])).toEqual([[2, 1], [1, 1 / 3], [3, 0]]); 37 | expect(sortFailureRates([[1, 1 / 3], [2, 1], [3, 0], [4, 1 / 3]])).toEqual([[2, 1], [1, 1 / 3], [4, 1 / 3], [3, 0]]); 38 | expect(sortFailureRates([[1, 0], [2, 0], [3, 0], [4, 1]])).toEqual([[4, 1], [1, 0], [2, 0], [3, 0]]); 39 | expect(sortFailureRates([[3, 0.5], [2, 0.5], [1, 0.5]])).toEqual([[1, 0.5], [2, 0.5], [3, 0.5]]); 40 | }); 41 | -------------------------------------------------------------------------------- /failurerate-skc-lyh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "failurerate-skc-lyh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /failurerate-skc/README.md: -------------------------------------------------------------------------------- 1 | # 실패율 2 | 3 | 1. 이해 4 | -N: 스테이지의 개수 5 | -stages배열: 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 6 | 실패율: 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 7 | 8 | 조건 9 | * 스테이지의 개수 N은 1 이상 500 이하의 자연수이다. 10 | * stages의 길이는 1 이상 200,000 이하이다. 11 | * stages에는 1 이상 N + 1 이하의 자연수가 담겨있다. 12 | * 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다. 13 | * 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다. 14 | * 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다. 15 | * 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다. 16 | 17 | 2. 계획 18 | 1. 모든 스테이지에 대해 실패율을 배열로 구한다. 19 | 1. 분모는 stages의 값들이 현재 스테이지보다 크거나 같은것의 개수 20 | 2. 분자는 stages값과 현재 스테이지 값이 같은것의 개수 21 | 2. 빈 객체를 만든다 22 | 3. 실패율을 구한 array를 돌면서 실패율을 key로하고 value는 배열로 만는데 index + 1(스테이지가 1부터시작하기 때문)값을 배열에 넣는다. 23 | 4. 객체로부터 key값(실패율)을 받아오고 내림차순으로 정렬하고 중복을 제거한다. 24 | 5. 빈 배열을 만든다 25 | 6. 4번에서 얻은 배열을 loop돌면서 객체의 값을 가져와서 빈 객체에 배열 값을 넣는다. -------------------------------------------------------------------------------- /failurerate-skc/failurerate.test.js: -------------------------------------------------------------------------------- 1 | function solution(N, stages) { 2 | const failurerates = failurerateOfStages(N, stages); 3 | const hashTable = createHashTable(failurerates) 4 | const uniqFailurerateByDesc = DeduplicationAndDescendingSort(failurerates); 5 | 6 | return uniqFailurerateByDesc.reduce((acc, cur) => ( 7 | [...acc, ...hashTable[cur]] 8 | ), []); 9 | } 10 | 11 | const failurerateOfStages = (n, stages) => { 12 | let results = []; 13 | for (let i = 1; i <= n; i++) { 14 | const over = stages.filter(cur => cur === i).length; 15 | const under = stages.filter(cur => cur >= i).length; 16 | results.push(under !== 0 ? over / under : 0); 17 | } 18 | return results; 19 | } 20 | 21 | const createHashTable = (failurerateArray) => { 22 | return failurerateArray.reduce((acc, cur, index) => ( 23 | { 24 | ...acc, 25 | [cur]: (acc[cur] 26 | ? [...acc[cur], index + 1] 27 | : [index + 1]) 28 | } 29 | ), {}); 30 | } 31 | 32 | const DeduplicationAndDescendingSort = (failurerateArray) => { 33 | var uniqByDesc = failurerateArray // 정렬하기 전에 복사본을 만든다. 34 | .sort(function (a, b) { 35 | return b - a; 36 | }) 37 | .reduce(function (a, b) { 38 | if (a.slice(-1)[0] !== b) a.push(b); // slice(-1)[0] 을 통해 마지막 아이템을 가져온다. 39 | return a; 40 | }, []); //a가 시작될 때를 위한 비어있는 배열 41 | 42 | return uniqByDesc; 43 | } 44 | 45 | test('failurerate', () => { 46 | expect(solution(5, [2, 1, 2, 6, 2, 4, 3, 3])).toEqual([3, 4, 2, 1, 5]); 47 | expect(solution(4, [4, 4, 4, 4, 4])).toEqual([4, 1, 2, 3]); 48 | }); 49 | 50 | test('failurerateOfStages', () => { 51 | expect(failurerateOfStages(5, [2, 1, 2, 6, 2, 4, 3, 3])).toEqual([1 / 8, 3 / 7, 2 / 4, 1 / 2, 0]) 52 | }) 53 | 54 | test('createHashTable', () => { 55 | expect(createHashTable([1 / 8, 3 / 7, 2 / 4, 1 / 2, 0])).toEqual({ 56 | [1/8]: [1], 57 | [3/7]: [2], 58 | [1/2]: [3, 4], 59 | [0]: [5] 60 | }) 61 | }) 62 | 63 | test('DeduplicationAndDescendingSort', () => { 64 | expect(DeduplicationAndDescendingSort([1 / 8, 3 / 7, 2 / 4, 1 / 2, 0])).toEqual([1 / 2, 3 / 7, 1 / 8, 0]); 65 | expect(DeduplicationAndDescendingSort([1, 1, 1, 3, 3, 4, 2, 1, 3, 5, 3, 4])).toEqual([5, 4, 3, 2, 1]); 66 | }) -------------------------------------------------------------------------------- /ironstick-csh-hhj/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | .idea 8 | -------------------------------------------------------------------------------- /ironstick-csh-hhj/README.md: -------------------------------------------------------------------------------- 1 | ## 1. 이해 2 | - '()'는 레이저를 표현함. '(' 다음에 바로 ')' 오면 레이저임. 3 | - '('는 반드시 ')'과 쌍을 이룸. 4 | - '('는 괄호의 개수가 현재 쌓인 막대기의 개수인데 '()'는 막대기로 생각하지 않음. 5 | - 막대기의 길이가 끝나면 한 조각 추가된다. 6 | - 막대기가 레이저를 만나면 현재 쌓인 막대기 개수만큼 +된다. 7 | 예를 들어 현재 막대기가 3개 쌓여 있는 상태에서 레이저를 만나면 +3 조각. 8 | - 레이저는 막대기를 자르지 않을 수도 있다. 허공샷. 9 | 10 | ## 2. 계획 11 | 12 | 1. arrangement(문자열)를 하나씩 읽어온다. 13 | 2. 읽어올 때 다음 문자열도 먼저 확인한다. -> 레이저 여부를 확인하기 위해. 14 | 2-1. 레이저가 아니면('('만 왔을 경우) 막대기 개수 stack에 개수 하나 추가. 15 | 2-2. 레이저인 경우 현재 쌓인 막대기 개수(stack)만큼 total += count. 16 | 3. ')'가 왔을 경우 stack에서 한개 제거 후 total += 1 17 | 4. stack 초기 길이를 0으로 -> 허공샷일 때 total += 0 위해 18 | 19 | ## 3. 실행 20 | 21 | ## 4. 반성 22 | -------------------------------------------------------------------------------- /ironstick-csh-hhj/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM. 9 | id("org.jetbrains.kotlin.jvm").version("1.3.20") 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving your dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Use the Kotlin JDK 8 standard library. 23 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 24 | 25 | // Use the Kotlin test library. 26 | testImplementation("org.jetbrains.kotlin:kotlin-test") 27 | 28 | // Use the Kotlin JUnit integration. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 30 | 31 | testImplementation("org.assertj:assertj-core:3.11.1") 32 | } 33 | 34 | application { 35 | // Define the main class for the application. 36 | mainClassName = "com.codingdojo.ironstick.AppKt" 37 | } 38 | -------------------------------------------------------------------------------- /ironstick-csh-hhj/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/ironstick-csh-hhj/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /ironstick-csh-hhj/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /ironstick-csh-hhj/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS='"-Xmx64m"' 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /ironstick-csh-hhj/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /ironstick-csh-hhj/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.2/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "ironstick-csh-hhj" 11 | -------------------------------------------------------------------------------- /ironstick-csh-hhj/src/test/kotlin/com/codingdojo/ironstick/SolutionTest.kt: -------------------------------------------------------------------------------- 1 | package com.codingdojo.ironstick 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | fun solution1(arrangement: String): Int { 7 | tailrec fun step(arrangement: String, sticks: Int, total: Int): Int = when { 8 | arrangement.isEmpty() -> total 9 | arrangement.first() == '(' -> step(arrangement.drop(1), sticks + 1, total) 10 | arrangement.first() == '*' -> step(arrangement.drop(1), sticks, total + sticks) 11 | else -> step(arrangement.drop(1), sticks - 1, total + 1) 12 | } 13 | 14 | return step(arrangement.replace("()", "*"), 0, 0) 15 | } 16 | 17 | fun solution2(arrangement: String): Int = 18 | arrangement.replace("()", "*").fold(Pair(0, 0)) { acc, c -> 19 | when (c) { 20 | '(' -> Pair(acc.first + 1, acc.second) 21 | '*' -> Pair(acc.first, acc.second + acc.first) 22 | else -> Pair(acc.first - 1, acc.second + 1) 23 | } 24 | }.second 25 | 26 | class SolutionTest { 27 | 28 | @Test 29 | fun `Calculate the total number of truncated bar pieces`() { 30 | arrayOf(::solution1, ::solution2).forEach { solution -> 31 | assertThat(solution("(()())")).isEqualTo(3) 32 | assertThat(solution("()")).isEqualTo(0) 33 | assertThat(solution("()(((()())(())()))(())")).isEqualTo(17) 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /ironstick-ksh-hsj-joker/ironstick_test.py: -------------------------------------------------------------------------------- 1 | # 2 | # 3 | # 1. 문제 이해 4 | # - 알아내야 하는 것: 몇 조각으로 나눠지는가? 5 | # - 자료: 괄호의 가운데가 잘린다. => () 모양은 자르는 지점. 6 | # -> 괄호의 의미? 막대기의 양 끝을 괄호로 표현. 그냥 ()이면 막대기가 아니라 레이저 절단부. 7 | # - 조건: 긴 막대는 짧은 막대를 무조건 포함. 8 | # 아래는 불가능 9 | # ==== 10 | # ==== 11 | # 아래는 가능 12 | # ===== 13 | # === 14 | # 15 | # 2. 계획 수립 16 | # - 현재 자를 수 있는 막대기가 몇 개인가? 17 | # - 잘린 막대기가 몇 개인가? 18 | # - 막대기가 끝나면 잘린 막대기로 넣어준다. 19 | # e.g. (((()))) => 6개 20 | # ======== 21 | # ====== 22 | # === 23 | # ^ 24 | # 25 | # 3. 계획 실행 26 | # -> 코딩 + 테스트 코드를 통해 각 단계를 검증! 27 | # 28 | # 4. 반성 29 | # - 제대로 풀었는가? 30 | # - 다르게 풀 수 있을까? 31 | # - 다른 문제에 적용할 수 있을까? 32 | 33 | PROCESS = { 34 | '(': {'piece': 0, 'stick': 1}, 35 | ')': {'piece': 1, 'stick': -1}, 36 | 'x': {'piece': 0, 'stick': 0}, 37 | } 38 | 39 | 40 | def solution1(sticks): 41 | pieces_count = 0 42 | sticks_count = 0 43 | for c in sticks.replace('()', 'x'): 44 | if c == 'x': 45 | pieces_count += sticks_count 46 | pieces_count += PROCESS[c]['piece'] 47 | sticks_count += PROCESS[c]['stick'] 48 | return pieces_count 49 | 50 | 51 | def solution2(sticks): 52 | pieces_count = 0 53 | sticks_count = 0 54 | for c in sticks.replace('()', 'x'): 55 | if c == 'x': 56 | pieces_count += sticks_count 57 | if c == '(': 58 | sticks_count += 1 59 | if c == ')': 60 | pieces_count += 1 61 | sticks_count -= 1 62 | return pieces_count 63 | 64 | 65 | def test_solution(): 66 | for solution in [solution1, solution2]: 67 | assert solution('(((())))') == 6 68 | assert solution('(((())()))') == 8 69 | assert solution('()(((()())(())()))(())') == 17 70 | -------------------------------------------------------------------------------- /knumber-csh-lyh/README.md: -------------------------------------------------------------------------------- 1 | ## 1. 이해 2 | 3 | - 아는 것 4 | - array = 숫자 배열 5 | - commands = [[i, j, k],[...],[...]] 로 이뤄진 2차원 배열 6 | - result i번째 숫자에서 j번째 숫자까지 array에서 잘라서 정렬 후 k번째 숫자를 각 commands에서 return 결과를 담은 배열 7 | - 단 array의 첫번째 index는 0부터가 아니라 1. 8 | 9 | ## 2. 계획 10 | 11 | 1. 입력 받은 commands 배열을 순회하여 각 command를 추출하여 [i, j, k]값을 뽑는다. 12 | 2. [i, j, k]를 참조하여 array에서 i번째부터 j번째까지 slice한 후 정렬한다. 13 | 3. 정렬된 배열에서 k번째 숫자를 뽑아서 return 하여 result 배열에 담는다. 14 | 4. 모든 command에 대해 2-3 명령을 수행한 후 종료. 15 | 16 | ## 3. 실행 17 | 18 | ## 4. 반성 19 | -------------------------------------------------------------------------------- /knumber-csh-lyh/knumber.test.js: -------------------------------------------------------------------------------- 1 | const getKnumber = (array, commands) => 2 | commands.map(([start, end, k]) => 3 | array.slice(start - 1, end).sort(compare)[k - 1], 4 | ); 5 | 6 | const compare = (a, b) => { 7 | return a - b; 8 | }; 9 | 10 | test('getKnumber', () => { 11 | expect(getKnumber([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]])) 12 | .toEqual([5, 6, 3]); 13 | expect(getKnumber([1, 5, 2], [[1, 3, 2]])).toEqual([2]); 14 | expect(getKnumber([2, 1, 11], [[1, 3, 2]])).toEqual([2]); 15 | }); -------------------------------------------------------------------------------- /knumber-csh-lyh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "knumber-csh-lyh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@types/jest": "^27.0.1", 13 | "jest": "^27.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /knumber-hj-ys/KNumber.kt: -------------------------------------------------------------------------------- 1 | package com.hyejineee.KNumber 2 | 3 | fun KNumber(array: IntArray, commands: Array): IntArray { 4 | return commands.map { (i, j, k) -> 5 | array.slice(i - 1..j - 1) 6 | .sorted()[k - 1] 7 | }.toIntArray() 8 | } -------------------------------------------------------------------------------- /knumber-hj-ys/KNumberTest.kt: -------------------------------------------------------------------------------- 1 | package com.hyejineee.KNumberTest 2 | 3 | import com.hyejineee.KNumber.KNumber 4 | import org.hamcrest.CoreMatchers.`is` 5 | import org.hamcrest.CoreMatchers.equalTo 6 | import org.junit.Assert.assertThat 7 | import org.junit.Test 8 | 9 | class KNumberTest { 10 | @Test 11 | fun KNumberTest() { 12 | assertThat( 13 | KNumber( 14 | intArrayOf(1, 5, 2, 6, 3, 7, 4), 15 | arrayOf( 16 | intArrayOf(2, 5, 3), 17 | intArrayOf(4, 4, 1), 18 | intArrayOf(1, 7, 3) 19 | ) 20 | ), 21 | `is`(equalTo(intArrayOf(5,6,3))) 22 | ) 23 | } 24 | } -------------------------------------------------------------------------------- /knumber-joker/.python-version: -------------------------------------------------------------------------------- 1 | 3.7.4 2 | -------------------------------------------------------------------------------- /knumber-joker/knumber_test.py: -------------------------------------------------------------------------------- 1 | def knumbers(numbers, commands): 2 | return [knumber(numbers, command) for command in commands] 3 | 4 | 5 | def knumber(numbers, command): 6 | begin, end, k = command 7 | return sorted(numbers[begin - 1:end])[k - 1] 8 | 9 | 10 | def test_sample(): 11 | assert knumbers([1, 5, 2, 6, 3, 7, 4], 12 | [[2, 5, 3], [4, 4, 1], [1, 7, 3]]) == [5, 6, 3] 13 | 14 | 15 | def test_knumber(): 16 | assert knumber([1, 5, 2, 6, 3, 7, 4], [2, 5, 3]) == 5 17 | assert knumber([1, 5, 2, 6, 3, 7, 4], [2, 4, 3]) == 6 18 | -------------------------------------------------------------------------------- /knumber-joker/requirements.txt: -------------------------------------------------------------------------------- 1 | pytest 2 | pytest-watch 3 | -------------------------------------------------------------------------------- /knumber-ym-dw/k_number.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | vector slice(vector array, int start, int end) 8 | { 9 | vector temp; 10 | for(int i = start; i < end; i++) 11 | { 12 | temp.push_back(array[i]); 13 | } 14 | return temp; 15 | } 16 | 17 | int knumber (vector array, vector command) 18 | { 19 | // step 2 임시 자료구조인 임시 벡터를 생성한다. 20 | vector temp; 21 | temp = slice(array, command[0]-1, command[1]); 22 | sort(temp.begin(), temp.end()); 23 | 24 | return temp[command[2]-1]; 25 | } 26 | 27 | vector solution(vector array, vector> commands) 28 | { 29 | vector answer; 30 | // step 1 for문을 돌아서 command의 길이만큼 연산을 수행한다. 31 | 32 | vector >::iterator command_iter; 33 | for(command_iter = commands.begin(); command_iter != commands.end(); command_iter++) 34 | { 35 | // step 3 command의 명령을 읽는다 (*command_iter) 36 | auto command = *command_iter; 37 | int n = knumber(array, command); 38 | answer.push_back(n); 39 | } 40 | return answer; 41 | } 42 | 43 | 44 | int main() { 45 | assert(knumber({1, 2, 3}, {1, 1, 1}) == 1); 46 | assert(knumber({1, 2, 3}, {1, 2, 1}) == 1); 47 | assert(knumber({1, 2, 3}, {1, 2, 2}) == 2); 48 | assert(slice({1, 5, 2, 6, 3, 7, 4}, {4, 4, 1}) == vector({6})); 49 | assert(knumber({1, 5, 2, 6, 3, 7, 4}, {4, 4, 1}) == 6); 50 | return 0; 51 | } 52 | -------------------------------------------------------------------------------- /marathon-csh-hys/incomplete-player.test.js: -------------------------------------------------------------------------------- 1 | const createHashTable = (data) => 2 | data.reduce((acc, cur) => ( 3 | { 4 | ...acc, 5 | [cur]: (acc[cur] || 0) + 1, 6 | } 7 | ), {}); 8 | 9 | const findLoser = (participants, completions) => 10 | Object.entries( 11 | completions.reduce((acc, cur) => ({ 12 | ...acc, 13 | [cur]: (acc[cur] - 1), 14 | }), createHashTable(participants)) 15 | ).find(second)[0]; 16 | 17 | const second = x => x[1]; 18 | 19 | test('findLoser', () => { 20 | expect(findLoser(['leo', 'kiki', 'eden'], ['eden', 'kiki'])).toBe('leo'); 21 | expect(findLoser( 22 | ['marina', 'josipa', 'nikola', 'vinko', 'filipa'], 23 | ['josipa', 'filipa', 'marina', 'nikola'] 24 | )).toBe('vinko'); 25 | expect(findLoser( 26 | ['mislav', 'stanko', 'mislav', 'ana'], 27 | ['stanko', 'ana', 'mislav'] 28 | )).toBe('mislav'); 29 | }); 30 | 31 | test('createHashTable', () => { 32 | expect(createHashTable(['leo', 'kiki', 'eden'])).toEqual({ 33 | leo: 1, 34 | kiki: 1, 35 | eden: 1, 36 | }); 37 | expect(createHashTable(['leo', 'leo', 'kiki', 'eden'])).toEqual({ 38 | leo: 2, 39 | kiki: 1, 40 | eden: 1, 41 | }); 42 | }) -------------------------------------------------------------------------------- /marathon-dali/README.md: -------------------------------------------------------------------------------- 1 | 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 2 | 3 | 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 4 | 5 | 제한사항 6 | 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. 7 | completion의 길이는 participant의 길이보다 1 작습니다. 8 | 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 9 | 참가자 중에는 동명이인이 있을 수 있습니다. -------------------------------------------------------------------------------- /marathon-dali/babel.config.js: -------------------------------------------------------------------------------- 1 | // babel.config.js 2 | module.exports = { 3 | presets: [ 4 | [ 5 | '@babel/preset-env', 6 | { 7 | targets: { 8 | node: 'current', 9 | }, 10 | }, 11 | ], 12 | ], 13 | }; -------------------------------------------------------------------------------- /marathon-dali/marathon.js: -------------------------------------------------------------------------------- 1 | export default (participant, completion) => { 2 | const completionObj = completion.reduce((acc, cur) => ({ 3 | ...acc, 4 | [cur]: (acc[cur] || 0) + 1, 5 | }), {}); 6 | 7 | let completionCount = completion.length; 8 | 9 | return participant.reduce((acc, cur) => { 10 | return acc['result'] ? acc 11 | : acc[cur] ? { ...acc, [cur]: acc[cur] -1} 12 | : {'result': cur} 13 | },completionObj).result; 14 | } -------------------------------------------------------------------------------- /marathon-dali/marathon.test.js: -------------------------------------------------------------------------------- 1 | import getLoser from './marathon.js'; 2 | 3 | 4 | describe('get Loser', () => { 5 | // 일반 6 | test("['1','2','3'], ['1','2'] 일때 loser는 3이다.", () => { 7 | expect(getLoser(['1','2','3'], ['1','2'] )).toBe("3") 8 | }); 9 | // 동명 이인이 있을 때 10 | test(" [mislav, stanko, mislav, ana] [stanko, ana, mislav] 일때 loser는 'mislav'이다.", () => { 11 | expect(getLoser( ['mislav', 'stanko', 'mislav', 'ana'], ['stanko', 'ana', 'mislav'] )).toBe("mislav") 12 | }) 13 | // 참가자가 1명일 때 14 | test(" [mislav] [] 일때 loser는 'mislav'이다.", () => { 15 | expect(getLoser(['mislav'], [] )).toBe("mislav") 16 | }); 17 | 18 | 19 | }) -------------------------------------------------------------------------------- /marathon-dali/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "peuniforms-dali", 3 | "version": "1.0.0", 4 | "description": "수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.", 5 | "main": "peuniforms.test.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@babel/core": "^7.15.5", 14 | "@babel/preset-env": "^7.15.6", 15 | "babel-jest": "^27.2.0", 16 | "jest": "^27.2.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /marathon-khj-skc/test_marathon.py: -------------------------------------------------------------------------------- 1 | def solution(participant, completion): 2 | incompletion = {} 3 | for name in participant: 4 | incompletion[name] = incompletion.get(name, 0) + 1 5 | 6 | for name in completion: 7 | incompletion[name] -= 1 8 | 9 | for name in incompletion: 10 | if incompletion[name] == 1: 11 | return name 12 | 13 | 14 | def test_sample(): 15 | assert solution(['leo', 'kiki', 'eden'], ['eden', 'kiki']) == 'leo' 16 | assert solution(['marina', 'josipa', 'nikola', 'vinko', 'filipa'], 17 | ['josipa', 'filipa', 'marina', 18 | 'nikola']) == 'vinko' 19 | assert solution(['mislav', 'stanko', 'mislav', 'ana'], 20 | ['stanko', 'ana', 'mislav']) == 'mislav' 21 | -------------------------------------------------------------------------------- /mocktest-csh-lyh/README.md: -------------------------------------------------------------------------------- 1 | - 달랩 코딩도장 10/22 2 | - 참여자: 최수형, 이영한 3 | - [프로그래머스 모의고사 문제](https://programmers.co.kr/learn/courses/30/lessons/42840) -------------------------------------------------------------------------------- /mocktest-csh-lyh/math-example.test.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | 1번 수포자가 찍는 방식: [1, 2, 3, 4, 5] 4 | 2번 수포자가 찍는 방식: [2, 1, 2, 3, 2, 4, 2, 5] 5 | 3번 수포자가 찍는 방식: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] 6 | */ 7 | 8 | const PATTERNS = [ 9 | [1, 2, 3, 4, 5], 10 | [2, 1, 2, 3, 2, 4, 2, 5], 11 | [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], 12 | ]; 13 | 14 | const getHighScoreStudents = answers => { 15 | const count = pattern => 16 | countCorrectAnswers(studentAnswers(pattern, answers.length), answers); 17 | 18 | const scores = PATTERNS.map(count); 19 | 20 | const maxScore = Math.max(...scores); 21 | 22 | return PATTERNS.reduce((students, _, index) => ( 23 | scores[index] === maxScore ? [...students, index + 1] : students 24 | ), []); 25 | }; 26 | 27 | const studentAnswers = (pattern, length) => 28 | [...Array(length)].map((_, i) => 29 | pattern[i % pattern.length] 30 | ); 31 | 32 | const countCorrectAnswers = (studentAnswers, answers) => 33 | answers.filter((answer, index) => 34 | answer === studentAnswers[index] 35 | ).length; 36 | 37 | test('getHighScoreStudents', () => { 38 | expect(getHighScoreStudents([1, 2, 3, 4, 5])).toEqual([1]); 39 | expect(getHighScoreStudents([1, 3, 2, 4, 2])).toEqual([1, 2, 3]); 40 | }); 41 | 42 | test('studentAnswers', () => { 43 | expect(studentAnswers([1, 2], 0)).toEqual([]); 44 | expect(studentAnswers([1, 2], 1)).toEqual([1]); 45 | expect(studentAnswers([1, 2], 2)).toEqual([1, 2]); 46 | expect(studentAnswers([1, 2], 3)).toEqual([1, 2, 1]); 47 | expect(studentAnswers([1, 2], 4)).toEqual([1, 2, 1, 2]); 48 | expect(studentAnswers([1, 2], 10)).toEqual([1, 2, 1, 2, 1, 2, 1, 2, 1, 2]); 49 | }); 50 | 51 | test('countCorrectAnswers', () => { 52 | expect(countCorrectAnswers([1, 2], [1, 2])).toBe(2); 53 | expect(countCorrectAnswers([1, 2], [3, 4])).toBe(0); 54 | expect(countCorrectAnswers([1, 2], [1, 4])).toBe(1); 55 | }); -------------------------------------------------------------------------------- /mocktest-csh-lyh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "math-example-csh-lyh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /mocktest-dali/mocktest.test.js: -------------------------------------------------------------------------------- 1 | //1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2 | //2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3 | // 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 4 | 5 | // 패턴이 있다. 1 번 은 5 번 반복 6 | // 2번은 8개로 반복 7 | // 3번은 10개 Set로 반복 8 | const getScoreSet = (answer, index) => { 9 | 10 | const P1_ANSWER_SET = [1,2,3,4,5]; 11 | const P2_ANSWER_SET = [2,1,2,3,2,4,2,5]; 12 | const P3_ANSWER_SET = [3,3,1,1,2,2,4,4,5,5]; 13 | const ANSWER_SET = [ 14 | P1_ANSWER_SET, 15 | P2_ANSWER_SET, 16 | P3_ANSWER_SET, 17 | ]; 18 | 19 | 20 | const getScore = (bool) => bool ? 1 : 0 21 | const isCorrect = (index, answer, set) => (set[index % set.length] === answer) 22 | 23 | return ANSWER_SET.map(set => getScore(isCorrect(index, answer, set))); 24 | } 25 | 26 | const getHighScorer = (answers) => { 27 | const totalScoreList = answers.reduce((acc, cur, i) => { 28 | const scoreList = getScoreSet(cur, i) 29 | return acc.map((v,i) => v + scoreList[i]) 30 | }, [0,0,0]) 31 | 32 | 33 | const max = Math.max(...totalScoreList) 34 | const rankingList = totalScoreList.map((v, i) => v === max ? i + 1 : 0).filter(v =>v!==0) 35 | 36 | return rankingList; 37 | } 38 | 39 | 40 | test('getScoreSet [1] to [true, false, false]', () => { 41 | expect(getScoreSet(1,0)).toEqual([1, 0, 0]) 42 | }) 43 | test('getHighScorer [1,2,3,4,5] to [1]', () => { 44 | expect(getHighScorer([1,2,3,4,5])).toEqual([1]) 45 | }) 46 | test('getHighScorer [1,2,3,4,5] to [1]', () => { 47 | expect(getHighScorer([1,3,2,4,2])).toEqual([1,2,3]) 48 | }) -------------------------------------------------------------------------------- /mocktest-dali/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mocktest-dali", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "jest": "^27.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /mocktest-hys-skc-kji/mock-test.test.js: -------------------------------------------------------------------------------- 1 | const patterns = [ 2 | [1, 2, 3, 4, 5], 3 | [2, 1, 2, 3, 2, 4, 2, 5], 4 | [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], 5 | ]; 6 | 7 | const isCorrect = (pattern, answer, index) => 8 | answer === pattern[index % pattern.length]; 9 | 10 | const first = x => x[0]; 11 | 12 | const exam = (answers) => { 13 | const scores = patterns.map((pattern, index) => 14 | answers.reduce((acc, cur, i) => 15 | isCorrect(pattern, cur, i) ? acc + 1 : acc, 0)); 16 | 17 | const max = Math.max(...scores); 18 | 19 | return scores.map((score, i) => [i + 1, score]) 20 | .filter(([_, score]) => score === max) 21 | .map(first); 22 | }; 23 | 24 | test('exam', () => { 25 | expect(exam([1, 2, 3, 4, 5])).toEqual([1]); 26 | expect(exam([1, 3, 2, 4, 2])).toEqual([1, 2, 3]); 27 | }); -------------------------------------------------------------------------------- /norepeat-csh-lyh/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/norepeat-csh-lyh/README.md -------------------------------------------------------------------------------- /norepeat-csh-lyh/norepeat.test.js: -------------------------------------------------------------------------------- 1 | /* 2 | - arr : 입력값의 배열 변수 3 | - answer : 결과값의 배열 변수 4 | - arr을 순회하면서 answer에 arr의 각 요소를 넣는다. 5 | - 넣을때에 answer의 마지막 값이 arr의 요소와 동일하지 않다면, answer에 입력값을 넣고, 동일하다면 넘어간다. 6 | arr answer 7 | [1,1,3,3,0,1,1] [1,3,0,1] 8 | [4,4,4,3,3] [4,3] 9 | */ 10 | 11 | const getNoRepeat = (arr) => arr.filter((v, i) => 12 | i === 0 || v !== arr[i - 1]); 13 | 14 | // const getNoRepeat = (arr) => 15 | // arr.reduce((acc, cur, index) => { 16 | // return (index === 0 || cur !== arr[index - 1]) ? [...acc, cur] : [...acc] ; 17 | // }, []); 18 | 19 | 20 | test('getNoRepeat',() => { 21 | expect(getNoRepeat([1,1,3,3,0,1,1])).toEqual([1,3,0,1]); 22 | expect(getNoRepeat([4,4,4,3,3])).toEqual([4, 3]); 23 | }); -------------------------------------------------------------------------------- /norepeat-csh-lyh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "norepeat-csh-lyh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@types/jest": "^27.0.1", 13 | "jest": "^27.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /norepeat-hys-skc/no-repeat.test.js: -------------------------------------------------------------------------------- 1 | const last = (arr) => 2 | arr.length > 0 ? arr[arr.length - 1] : undefined; 3 | 4 | const noRepeat1 = (arr) => 5 | arr.reduce((acc, cur) => 6 | cur !== last(acc) ? [...acc, cur] : acc, []); 7 | 8 | const noRepeat2 = (arr) => arr.filter((v, i) => v !== arr[i - 1]); 9 | 10 | test('noRepeat', () => { 11 | [noRepeat1, noRepeat2].forEach(noRepeat => { 12 | expect(noRepeat([1, 1])).toEqual([1]); 13 | expect(noRepeat([1, 1, 3, 3, 0, 1, 1])).toEqual([1, 3, 0, 1]); 14 | expect(noRepeat([4, 4, 4, 3, 3])).toEqual([4, 3]); 15 | }) 16 | }); 17 | 18 | test('last', () => { 19 | expect(last([])).toBe(undefined); 20 | expect(last([1, 2, 3, 4])).toBe(4); 21 | }); 22 | -------------------------------------------------------------------------------- /openchat-hhj-hys-lyh/OpenChat.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.openchat 2 | 3 | val commands = mapOf( 4 | "Enter" to "님이 들어왔습니다.", 5 | "Leave" to "님이 나갔습니다." 6 | ) 7 | 8 | fun chatLogs(records: Array): Array { 9 | val (ids, responses) = records.fold( 10 | Pair( 11 | mutableMapOf(), 12 | mutableListOf>() 13 | ) 14 | ) { (ids, responses), cur -> 15 | val (command, id, name) = "$cur ".split(" "); 16 | if (name.isNotEmpty()) { 17 | ids.set(id, name) 18 | } 19 | 20 | if (command != "Change") { 21 | responses.add(id to command) 22 | } 23 | 24 | ids to responses 25 | } 26 | 27 | return responses.map(toResult(ids)).toTypedArray() 28 | } 29 | 30 | val toResult: (MutableMap) -> (Pair) -> String = 31 | { ids -> 32 | { 33 | "${ids.get(it.first)}${commands.get(it.second)}" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /openchat-hhj-hys-lyh/OpenChatTest.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.openchat 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | internal class OpenChatKtTest { 7 | 8 | @Test 9 | fun chatLogsTest() { 10 | assertThat( 11 | chatLogs( 12 | arrayOf( 13 | "Enter uid1234 Muzi", 14 | "Enter uid4567 Prodo", 15 | "Leave uid1234", 16 | "Enter uid1234 Prodo", 17 | "Change uid4567 Ryan" 18 | ) 19 | ) 20 | ).isEqualTo( 21 | arrayOf( 22 | "Prodo님이 들어왔습니다.", 23 | "Ryan님이 들어왔습니다.", 24 | "Prodo님이 나갔습니다.", 25 | "Prodo님이 들어왔습니다." 26 | ) 27 | ) 28 | 29 | assertThat( 30 | chatLogs( 31 | arrayOf( 32 | "Enter uid1234 Muzi" 33 | ) 34 | ) 35 | ).isEqualTo( 36 | arrayOf( 37 | "Muzi님이 들어왔습니다." 38 | ) 39 | ) 40 | 41 | assertThat( 42 | chatLogs( 43 | arrayOf( 44 | "Enter uid1234 Muzi", 45 | "Leave uid1234 Muzi" 46 | ) 47 | ) 48 | ).isEqualTo( 49 | arrayOf( 50 | "Muzi님이 들어왔습니다.", 51 | "Muzi님이 나갔습니다." 52 | ) 53 | ) 54 | 55 | assertThat( 56 | chatLogs( 57 | arrayOf( 58 | "Enter uid1234 Muzi", 59 | "Change uid1234 Prodo" 60 | ) 61 | ) 62 | ).isEqualTo( 63 | arrayOf( 64 | "Prodo님이 들어왔습니다." 65 | ) 66 | ) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /openchat-khj-kyh-skc/README.md: -------------------------------------------------------------------------------- 1 | # 오픈 채팅방 2 | 3 | 문제 링크 : [오픈 채팅방](https://programmers.co.kr/learn/courses/30/lessons/42888?language=javascript) 4 | 5 | # 1. 이해 6 | 7 | # 2. 계획 8 | 9 | # 3. 실행 10 | 11 | # 4. 반성 12 | -------------------------------------------------------------------------------- /openchat-khj-kyh-skc/openchat.test.js: -------------------------------------------------------------------------------- 1 | const solution = records => { 2 | const tmp = { 3 | Enter: "님이 들어왔습니다.", 4 | Leave: "님이 나갔습니다." 5 | }; 6 | let obj = {}; 7 | const chatRecords = []; 8 | records.forEach(record => { 9 | const splited = split(record); 10 | // obj = createUserData(obj, splited); 11 | obj[splited[1]] = splited[2] || obj[splited[1]]; 12 | if (splited[0] !== "Change") chatRecords.push(createChatRecord(splited)); 13 | }); 14 | 15 | const answer = []; 16 | 17 | for (let i = 0; i < chatRecords.length; i++) { 18 | const finalNick = obj[chatRecords[i][1]]; 19 | answer.push(`${finalNick}${tmp[chatRecords[i][0]]}`); 20 | } 21 | 22 | return answer; 23 | }; 24 | 25 | const split = record => { 26 | return record.split(" "); 27 | }; 28 | 29 | const createUserData = (obj, arr) => { 30 | return { 31 | ...obj, 32 | [arr[1]]: arr[2] || obj[arr[1]] 33 | }; 34 | }; 35 | 36 | const createChatRecord = nextArr => { 37 | return [nextArr[0], nextArr[1]]; 38 | }; 39 | 40 | test("split", () => { 41 | expect(split("Enter uid1234 Muzi")).toEqual(["Enter", "uid1234", "Muzi"]); 42 | }); 43 | 44 | test("createUserData", () => { 45 | expect(createUserData({}, ["Enter", "uid1234", "Muzi"])).toEqual({ 46 | uid1234: "Muzi" 47 | }); 48 | }); 49 | 50 | test("createChatRecord", () => { 51 | expect(createChatRecord(["Enter", "uid1234", "Muzi"])).toEqual([ 52 | "Enter", 53 | "uid1234" 54 | ]); 55 | }); 56 | 57 | test("solution", () => { 58 | expect( 59 | solution([ 60 | "Enter uid1234 Muzi", 61 | "Enter uid4567 Prodo", 62 | "Leave uid1234", 63 | "Enter uid1234 Prodo", 64 | "Change uid4567 Ryan" 65 | ]) 66 | ).toEqual([ 67 | "Prodo님이 들어왔습니다.", 68 | "Ryan님이 들어왔습니다.", 69 | "Prodo님이 나갔습니다.", 70 | "Prodo님이 들어왔습니다." 71 | ]); 72 | expect( 73 | solution([ 74 | "Enter uid1234 Muzi", 75 | "Leave uid1234", 76 | "Enter uid4567 Prodo", 77 | "Enter uid1234 Prodo", 78 | "Change uid4567 Ryan" 79 | ]) 80 | ).toEqual([ 81 | "Prodo님이 들어왔습니다.", 82 | "Prodo님이 나갔습니다.", 83 | "Ryan님이 들어왔습니다.", 84 | "Prodo님이 들어왔습니다." 85 | ]); 86 | expect( 87 | solution([ 88 | "Enter uid1234 Muzi", 89 | "Change uid1234 Ryan", 90 | "Leave uid1234", 91 | "Enter uid4567 Prodo", 92 | "Enter uid1234 Prodo", 93 | "Leave uid4567" 94 | ]) 95 | ).toEqual([ 96 | "Prodo님이 들어왔습니다.", 97 | "Prodo님이 나갔습니다.", 98 | "Prodo님이 들어왔습니다.", 99 | "Prodo님이 들어왔습니다.", 100 | "Prodo님이 나갔습니다." 101 | ]); 102 | }); 103 | -------------------------------------------------------------------------------- /openchat-khj-kyh-skc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "openchat-khj-kyh-skc", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /openchat-ksh-sj-ssg/openchat_test.py: -------------------------------------------------------------------------------- 1 | MESSAGES = { 2 | 'Enter': '{}님이 들어왔습니다.', 3 | 'Leave': '{}님이 나갔습니다.', 4 | } 5 | 6 | def solution(actions): 7 | nicknames = {} 8 | events = [] 9 | for action in actions: 10 | command, uid, nickname = (action + ' ').split(' ')[:3] 11 | if command in ['Enter', 'Change']: 12 | nicknames[uid] = nickname 13 | if command in ['Enter', 'Leave']: 14 | events.append((command, uid)) 15 | 16 | # events = [ 17 | # (command, uid) 18 | # for command, uid, *_ in [action.split(' ') for action in actions] 19 | # if command in ['Enter', 'Leave'] 20 | # ] 21 | 22 | return [MESSAGES[command].format(nicknames[uid]) for command, uid in events] 23 | 24 | # result = [] 25 | # for command, uid in events: 26 | # result.append(MESSAGES[command].format(nicknames[uid])) 27 | # # if command == 'Enter': 28 | # # result.append('{}님이 들어왔습니다.'.format(nicknames[uid])) 29 | # # if command == 'Leave': 30 | # # result.append('{}님이 나갔습니다.'.format(nicknames[uid])) 31 | # return result 32 | 33 | 34 | def test_solution(): 35 | assert solution([ 36 | 'Enter uid1234 Muzi', 'Enter uid4567 Prodo', 37 | 'Leave uid1234', 'Enter uid1234 Prodo', 'Change uid4567 Ryan' 38 | ]) == [ 39 | 'Prodo님이 들어왔습니다.', 'Ryan님이 들어왔습니다.', 40 | 'Prodo님이 나갔습니다.', 'Prodo님이 들어왔습니다.' 41 | ] 42 | -------------------------------------------------------------------------------- /openchat-mgh-csh/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /openchat-mgh-csh/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | # IDE 8 | .idea/ 9 | -------------------------------------------------------------------------------- /openchat-mgh-csh/README.md: -------------------------------------------------------------------------------- 1 | # 문제의 이해 2 | 1. 닉네임으로 채팅방에 입장한다. 3 | 2. 사용자는 아이디로 구분한다. 4 | 3. 메시지 출력은 최종 닉네임으로 한다. 5 | 4. Enter와 Change의 경우에는 행동 + 아이디 + 닉네임 의 형태이다. 6 | 5. Leave 의 경우에는 행동 + 아이디 의 형태이다. 7 | 8 | # 문제 해결 9 | 1. 아이디:닉네임 인 맵을 생성한다. 10 | 2. Enter 나 Change 가 나오면 해당 아이디의 닉네임을 변경해준다. 11 | 3. 레코드 배열의 내용을 result 메시지로 바꿔서 result 배열에 넣어준다. 12 | 4. result return 해준다. 13 | -------------------------------------------------------------------------------- /openchat-mgh-csh/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin. 9 | id("org.jetbrains.kotlin.jvm") version "1.3.41" 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Align versions of all Kotlin components 23 | implementation(platform("org.jetbrains.kotlin:kotlin-bom")) 24 | 25 | // Use the Kotlin JDK 8 standard library. 26 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 27 | 28 | // Use the Kotlin test library. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test") 30 | 31 | // Use the Kotlin JUnit integration. 32 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 33 | 34 | testImplementation("org.assertj:assertj-core:3.13.2") 35 | } 36 | 37 | application { 38 | // Define the main class for the application. 39 | mainClassName = "openchat.mgh.csh.AppKt" 40 | } 41 | -------------------------------------------------------------------------------- /openchat-mgh-csh/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/openchat-mgh-csh/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /openchat-mgh-csh/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /openchat-mgh-csh/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 34 | 35 | @rem Find java.exe 36 | if defined JAVA_HOME goto findJavaFromJavaHome 37 | 38 | set JAVA_EXE=java.exe 39 | %JAVA_EXE% -version >NUL 2>&1 40 | if "%ERRORLEVEL%" == "0" goto init 41 | 42 | echo. 43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 44 | echo. 45 | echo Please set the JAVA_HOME variable in your environment to match the 46 | echo location of your Java installation. 47 | 48 | goto fail 49 | 50 | :findJavaFromJavaHome 51 | set JAVA_HOME=%JAVA_HOME:"=% 52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 53 | 54 | if exist "%JAVA_EXE%" goto init 55 | 56 | echo. 57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 58 | echo. 59 | echo Please set the JAVA_HOME variable in your environment to match the 60 | echo location of your Java installation. 61 | 62 | goto fail 63 | 64 | :init 65 | @rem Get command-line arguments, handling Windows variants 66 | 67 | if not "%OS%" == "Windows_NT" goto win9xME_args 68 | 69 | :win9xME_args 70 | @rem Slurp the command line arguments. 71 | set CMD_LINE_ARGS= 72 | set _SKIP=2 73 | 74 | :win9xME_args_slurp 75 | if "x%~1" == "x" goto execute 76 | 77 | set CMD_LINE_ARGS=%* 78 | 79 | :execute 80 | @rem Setup the command line 81 | 82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 83 | 84 | @rem Execute Gradle 85 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 86 | 87 | :end 88 | @rem End local scope for the variables with windows NT shell 89 | if "%ERRORLEVEL%"=="0" goto mainEnd 90 | 91 | :fail 92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 93 | rem the _cmd.exe /c_ return code! 94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 95 | exit /b 1 96 | 97 | :mainEnd 98 | if "%OS%"=="Windows_NT" endlocal 99 | 100 | :omega 101 | -------------------------------------------------------------------------------- /openchat-mgh-csh/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/6.0.1/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "openchat-mgh-csh" 11 | -------------------------------------------------------------------------------- /openchat-mgh-csh/src/test/kotlin/openchat/mgh/csh/OpenChat.kt: -------------------------------------------------------------------------------- 1 | package openchat.mgh.csh 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | fun solution(record: Array): Array { 7 | val users = mutableMapOf() 8 | val result = mutableListOf() 9 | var msg = record.map { it.split(" ") } 10 | 11 | record.forEachIndexed {index , _ -> 12 | if (msg[index][0] != "Leave") users[msg[index][1]] = msg[index][2] 13 | } 14 | 15 | record.forEachIndexed { index, _ -> 16 | if (msg[index][0] != "Change") { 17 | result.add("${users[msg[index][1]]}님이 ${changeCommandToMsg(msg[index][0])}") 18 | } 19 | } 20 | 21 | return result.toTypedArray() 22 | } 23 | 24 | fun changeCommandToMsg(command: String) = 25 | when (command) { 26 | "Enter" -> "들어왔습니다." 27 | else -> "나갔습니다." 28 | } 29 | 30 | internal class OpenChat { 31 | @Test 32 | fun `Print Message`() { 33 | assertThat( 34 | solution( 35 | arrayOf( 36 | "Enter uid1234 Muzi", 37 | "Enter uid4567 Prodo", 38 | "Leave uid1234", 39 | "Enter uid1234 Prodo", 40 | "Change uid4567 Ryan" 41 | ))) 42 | .isEqualTo( 43 | arrayOf( 44 | "Prodo님이 들어왔습니다.", 45 | "Ryan님이 들어왔습니다.", 46 | "Prodo님이 나갔습니다.", 47 | "Prodo님이 들어왔습니다." 48 | )) 49 | } 50 | 51 | @Test 52 | fun `Change command to message `() { 53 | assertThat(changeCommandToMsg("Enter")).isEqualTo("들어왔습니다.") 54 | assertThat(changeCommandToMsg("Leave")).isEqualTo("나갔습니다.") 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /openchat-sm-j/openchat.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | using namespace std; 8 | 9 | vector GetWords(string str) 10 | { 11 | vector result; 12 | istringstream ss(str); 13 | do { 14 | string word; 15 | ss >> word; 16 | result.push_back(word); 17 | } while (ss); 18 | 19 | return result; 20 | } 21 | 22 | vector solution(vector record) { 23 | vector answer; 24 | map userInfo; 25 | vector> userIO; 26 | 27 | for(auto& rec: record){ 28 | vector result = GetWords(rec); 29 | if (result[0] == "Enter"){ 30 | userInfo[result[1]] = result[2]; 31 | userIO.push_back(make_pair(result[1],true)); 32 | } 33 | else if (result[0] == "Leave"){ 34 | userIO.push_back(make_pair(result[1],false)); 35 | } 36 | else if (result[0] == "Change"){ 37 | userInfo[result[1]] = result[2]; 38 | } 39 | } 40 | 41 | for(auto& res: userIO){ 42 | if (res.second){ 43 | answer.push_back(userInfo[res.first]+"님이 들어왔습니다."); 44 | } 45 | else{ 46 | answer.push_back(userInfo[res.first]+"님이 나갔습니다."); 47 | } 48 | } 49 | 50 | return answer; 51 | } -------------------------------------------------------------------------------- /peuniforms-csh-lyh/README.md: -------------------------------------------------------------------------------- 1 | 2 | ## 1. 이해 3 | ### 알고 있는 것 4 | 5 | - 전체학생수 n, 6 | - 도난당한 학생들의 번호가 담긴 배열 lost, 7 | - 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve 8 | - 학생번호는 체격순-> 내 번호 앞뒤로만 빌려줄 수 있음. 9 | 10 | ### 모르는 것 11 | 12 | - 체육수업을 들을 수 있는 학생의 최댓값. 13 | 14 | ## 2. 계획 15 | 16 | 1. 각 학생이 현재 가진 체육복 개수를 표현하는 배열을 만든다. 단, 이 배열의 길이는 전체 학생수와 같다. 17 | 2. lost배열에 해당하는 학생의 index - 1 에 해당하는 학생의 개수가 2라면 해당 학생의 체육복 개수를 +1해준다. 18 | 3. 빌려준 학생에 해당하면 본인 개수 - 1을 해준다. 19 | 3. 만약 index - 1에 해당하는 학생의 체육복 개수가 1이라면 index + 1에 해당하는 학생의 체육복 개수를 확인하고 개수가 2라면 내꺼 + 1, 아니라면 pass 20 | 4. 모든 lost 배열에 해당하는 학생에 위의 연산을 반복한다. -------------------------------------------------------------------------------- /peuniforms-csh-lyh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "peuniforms-csh-lyh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^27.0.1", 14 | "jest": "^27.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /peuniforms-csh-lyh/peuniforms.test.js: -------------------------------------------------------------------------------- 1 | const getMaxAttendanceStudents = (n, lost, reserve) => { 2 | const uniformCounts = initUnitformCounts(n, lost, reserve); 3 | return processShareUniform(uniformCounts) 4 | .filter(i => i > 0).length; 5 | }; 6 | 7 | const initUnitformCounts = (n, lost, reserve) => { 8 | const uniformCounts = Array.from({ length: n }, v => 1); 9 | reserve.forEach(v => { 10 | uniformCounts[v - 1] += 1; 11 | }); 12 | lost.forEach(v =>{ 13 | uniformCounts[v - 1] -= 1; 14 | }); 15 | 16 | return uniformCounts; 17 | }; 18 | 19 | const processShareUniform = (uniformCounts) => { 20 | return uniformCounts.reduce((uniformCounts, cur, index) => { 21 | if (cur > 0) { 22 | return uniformCounts; 23 | } 24 | const range = [-1, 1]; 25 | range.forEach(offset => rentFromNext(uniformCounts, index, offset)); 26 | 27 | return uniformCounts; 28 | }, uniformCounts); 29 | }; 30 | 31 | const rentFromNext = (uniformCounts, index, offset) => { 32 | if (uniformCounts[index] > 0) { 33 | return uniformCounts; 34 | } 35 | const target = index + offset; 36 | if (target < 0 || target > (uniformCounts.length - 1)) { 37 | return uniformCounts; 38 | } 39 | if (uniformCounts[target] > 1) { 40 | uniformCounts[target] -= 1; 41 | uniformCounts[index] += 1; 42 | return uniformCounts; 43 | } 44 | }; 45 | 46 | test('getMaxAttendanceStudents', () => { 47 | expect(getMaxAttendanceStudents(5, [2, 4], [1, 3, 5])).toBe(5); 48 | expect(getMaxAttendanceStudents(5, [2, 4], [3])).toBe(4); 49 | expect(getMaxAttendanceStudents(5, [1, 2, 4], [2, 3])).toBe(4); 50 | }); 51 | 52 | test('initUnitformCounts', () => { 53 | expect(initUnitformCounts(5, [2, 4], [1, 3, 5])).toEqual([2, 0, 2, 0, 2]); 54 | expect(initUnitformCounts(5, [2, 4], [3])).toEqual([1, 0, 2, 0, 1]); 55 | expect(initUnitformCounts(5, [1, 2, 4], [2, 3])).toEqual([0, 1, 2, 0, 1]); 56 | }); 57 | 58 | test('processShareUniform', () => { 59 | expect(processShareUniform([2, 0, 2, 0, 2])).toEqual([1, 1, 1, 1, 2]); 60 | expect(processShareUniform([1, 0, 2, 0, 1])).toEqual([1, 1, 1, 0, 1]); 61 | expect(processShareUniform([0, 1, 2, 0, 1])).toEqual([0, 1, 1, 1, 1]); 62 | expect(processShareUniform([0, 2, 1, 2, 0])).toEqual([1, 1, 1, 1, 1]); 63 | }); 64 | 65 | test('rentFromNext', () => { 66 | expect(rentFromNext([2, 0, 2, 0, 2], 1, -1)).toEqual([1, 1, 2, 0, 2]); 67 | expect(rentFromNext([0, 1, 2, 0, 1], 0, -1)).toEqual([0, 1, 2, 0, 1]); 68 | }) -------------------------------------------------------------------------------- /peuniforms-joker-cena/peuniforms_test.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | 3 | 4 | def solution(n, lost, reserve): 5 | return n - process_students(init_students(n, lost, reserve)).count(-1) 6 | 7 | 8 | def init_students(n, lost, reserve): 9 | return [(i in reserve) - (i in lost) for i in range(1, n + 1)] 10 | 11 | 12 | def F(f): 13 | return lambda acc, x: f(acc, x) 14 | 15 | 16 | def process_students(students): 17 | return reduce(F(process_student), range(len(students)), students) 18 | 19 | 20 | def process_student(students, index): 21 | if students[index] >= 0: 22 | return students 23 | for i in [-1, 1]: 24 | target = index + i 25 | if not 0 <= target < len(students): 26 | continue 27 | if students[target] > 0: 28 | students[target] -= 1 29 | students[index] += 1 30 | return students 31 | return students 32 | 33 | 34 | def test_sample(): 35 | assert solution(5, [2, 4], [1, 3, 5]) == 5 36 | assert solution(5, [1, 3, 5], [2, 4]) == 4 37 | assert solution(5, [2, 4], [3]) == 4 38 | assert solution(3, [3], [1]) == 2 39 | assert solution(3, [1, 2], [2, 3]) == 2 40 | 41 | 42 | def test_init_students(): 43 | assert init_students(5, [2, 4], [1, 3, 5]) == [1, -1, 1, -1, 1] 44 | assert init_students(5, [2, 4], [3]) == [0, -1, 1, -1, 0] 45 | assert init_students(5, [2, 4], [2, 3]) == [0, 0, 1, -1, 0] 46 | 47 | 48 | def test_process_students(): 49 | assert process_students([1, -1, 1, -1, 1]) == [0, 0, 0, 0, 1] 50 | 51 | 52 | def test_process_student(): 53 | assert process_student([1, -1, 1, -1, 1], 1) == [0, 0, 1, -1, 1] 54 | assert process_student([1, -1, 1, -1, 1], 0) == [1, -1, 1, -1, 1] 55 | assert process_student([1, -1, 1, -1, 1], 3) == [1, -1, 0, 0, 1] 56 | assert process_student([1, -1, 0, -1, 0], 3) == [1, -1, 0, -1, 0] 57 | assert process_student([0, -1, 2, -1, 0], 1) == [0, 0, 1, -1, 0] 58 | -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | .idea 8 | -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/README.md: -------------------------------------------------------------------------------- 1 | ## 1. 이해 2 | 3 | - 접두어: 다른 번호의 시작이 되는 것. prefix. 4 | - 접두어보단 길거나 같다(전화번호 중복에 대한 예외는 없음.) 5 | - 배열의 한 전화번호가 다른 전화번호의 접두어가 될 경우 false. 6 | - startsWith를 쓰자. 7 | 8 | ## 2. 계획 9 | 10 | 1. 대상 번호를 접두어로 쓰는 번호는 당연히 접두어보다 같거나 길기 때문에 11 | 우선 배열을 정렬한다. 12 | 2. 그러면 첫번째 요소부터 순차적으로 T.startsWith(첫번째요소) 로 순차탐색하여 13 | 단 하나라도 나오면 즉시 false 반환. 14 | 3. 모든 요소를 탐색해도 없으면 true. 15 | 16 | ## 3. 실행 17 | 18 | ## 4. 반성 19 | -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM. 9 | id("org.jetbrains.kotlin.jvm").version("1.3.20") 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving your dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Use the Kotlin JDK 8 standard library. 23 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 24 | 25 | // Use the Kotlin test library. 26 | testImplementation("org.jetbrains.kotlin:kotlin-test") 27 | 28 | // Use the Kotlin JUnit integration. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 30 | 31 | testImplementation("org.assertj:assertj-core:3.11.1") 32 | } 33 | 34 | application { 35 | // Define the main class for the application. 36 | mainClassName = "com.codingdojo.phonenumbers.AppKt" 37 | } 38 | -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/phonenumbers-csh-lyh/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.2/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "kotlin" 11 | -------------------------------------------------------------------------------- /phonenumbers-csh-lyh/src/test/kotlin/com/codingdojo/phonenumbers/SolutionTest.kt: -------------------------------------------------------------------------------- 1 | package com.codingdojo.phonenumbers 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | fun solution(phone_book: Array): Boolean { 7 | tailrec fun step(head: String, phone_book: List): Boolean = when { 8 | phone_book.isEmpty() -> true 9 | phone_book.hasPrefix(head) -> false 10 | else -> step(phone_book.first(), phone_book.drop(1)) 11 | } 12 | phone_book.sort() 13 | return step(phone_book.first(), phone_book.drop(1)) 14 | } 15 | 16 | fun Collection.hasPrefix(prefix: T) = any { it.startsWith(prefix) } 17 | 18 | class SolutionTest { 19 | 20 | @Test 21 | fun `Find cases where one phone number is prefixed to another`() { 22 | assertThat(solution(arrayOf("119", "97674223", "1195524421"))).isEqualTo(false) 23 | assertThat(solution(arrayOf("123", "456", "789"))).isEqualTo(true) 24 | assertThat(solution(arrayOf("12", "123", "1235","567","88"))).isEqualTo(false) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /phonenumbers-hys-las/PhoneNumbers.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.phonenumbers 2 | 3 | fun solution(phoneNumbers: List) = 4 | !phoneNumbers.mapIndexed { i, prefixString -> 5 | isPrefixIn(phoneNumbers.splice(i), prefixString) 6 | }.any { it } 7 | 8 | fun isPrefixIn(strings: List, prefix: String) = 9 | strings.map { it.startsWith(prefix) } 10 | .any { it } 11 | 12 | fun List.splice(index: Int) = 13 | this.filterIndexed { i, _ -> i != index } 14 | -------------------------------------------------------------------------------- /phonenumbers-hys-las/PhoneNumbersTest.kt: -------------------------------------------------------------------------------- 1 | package com.dojo.phonenumbers 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | internal class PhoneNumbersKtTest { 7 | @Test 8 | fun phoneNumbers() { 9 | assertThat( 10 | solution(arrayListOf("119", "97674223", "1195524421")) 11 | ).isEqualTo(false) 12 | 13 | assertThat( 14 | solution(arrayListOf("97674223", "119", "1195524421")) 15 | ).isEqualTo(false) 16 | 17 | assertThat( 18 | solution(arrayListOf("97674223", "1195524421", "119")) 19 | ).isEqualTo(false) 20 | 21 | assertThat( 22 | solution(arrayListOf("97674223", "1195524421", "32382", "119")) 23 | ).isEqualTo(false) 24 | 25 | assertThat( 26 | solution(arrayListOf("123", "456", "789")) 27 | ).isEqualTo(true) 28 | 29 | assertThat( 30 | solution(arrayListOf("12", "123", "1235", "567", "88")) 31 | ).isEqualTo(false) 32 | 33 | assertThat( 34 | solution(arrayListOf("12", "12")) 35 | ).isEqualTo(false) 36 | } 37 | 38 | @Test 39 | fun isPrefixIn() { 40 | assertThat( 41 | isPrefixIn(arrayListOf("97674223", "1195524421"), "119") 42 | ).isEqualTo(true) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /phonenumbers-jiun/phone-number.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | bool solution(std::vector phone_book) { 5 | for (const auto first : phone_book) { 6 | for (const auto second : phone_book) { 7 | if (first == second) { 8 | continue; 9 | } 10 | 11 | const auto longer = first.size() > second.size() ? first : second; 12 | const auto shorter = first.size() > second.size() ? second : first; 13 | 14 | auto res = std::mismatch(shorter.begin(), shorter.end(), longer.begin()); 15 | if (res.first == shorter.end()) { 16 | return false; 17 | } 18 | } 19 | } 20 | return true; 21 | } 22 | -------------------------------------------------------------------------------- /phonenumbers-jiun/phone-number.py: -------------------------------------------------------------------------------- 1 | from itertools import combinations 2 | from functools import partial 3 | 4 | def solution(phone_book): 5 | return not any(filter(lambda x: str.startswith(*x), (map(partial(sorted, key=len, reverse=True), combinations(phone_book, 2))))) 6 | -------------------------------------------------------------------------------- /phonenumbers-khj-kyh-will/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "phonenumbers-khj-kyh-will", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^25.1.0", 14 | "jest": "^25.1.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /phonenumbers-khj-kyh-will/phonenumbers.test.js: -------------------------------------------------------------------------------- 1 | // const solution = (phonebook) => { 2 | // let flag = true 3 | // phonebook.sort((a, b) => a.length - b.length); 4 | // for(let i = 0; i < phonebook.length; i++) { 5 | // // for(let j = i + 1; j { 17 | // if (p !== phonebook[i]) { 18 | // p.indexOf(phonebook[i]) 19 | // } 20 | // }) 21 | // return flag 22 | // } 23 | // return flag 24 | // } 25 | 26 | // test('solution', () => { 27 | // expect(solution(["119", "97674223", "1195524421"])).toBeFalsy(); 28 | // expect(solution(["123", "456", "789"])).toBeTruthy(); 29 | // expect(solution(["123","12","1235","567","88", "88888"])).toBeFalsy(); 30 | // expect(solution(["897","22","78793","567","44","89"])).toBeFalsy(); 31 | // }); 32 | 33 | const testSome = (i, phonebook) => { 34 | phonebook.some((p) => p.indexOf(phonebook[i]) !== -1) 35 | } 36 | 37 | test('testSome', () => { 38 | expect(testSome(0, ["119", "97674223", "1195524421"])).toBeFalsy(); 39 | }) 40 | const findPrefix = (phonebook) =>{ 41 | phonebook.every(p=>{ 42 | 43 | }) 44 | } 45 | 46 | -------------------------------------------------------------------------------- /phonenumbers-sj-ksh-joker/phonenumbers_test.py: -------------------------------------------------------------------------------- 1 | from itertools import combinations 2 | 3 | 4 | def solution(phonenumbers): 5 | return not any(is_prefix(a, b) for a, b in combinations(phonenumbers, 2)) 6 | 7 | 8 | def is_prefix(a, b): 9 | if len(a) > len(b): 10 | return is_prefix(b, a) 11 | return b.startswith(a) 12 | 13 | 14 | def test_sample(): 15 | assert solution(['119', '97674223', '1195524421']) == False 16 | assert solution(['123', '456', '789']) == True 17 | assert solution(['12', '123', '1235', '567', '88']) == False 18 | 19 | 20 | def test_is_prefix(): 21 | assert is_prefix('119', '1191') == True 22 | assert is_prefix('1191', '119') == True 23 | assert is_prefix('119', '191') == False 24 | 25 | -------------------------------------------------------------------------------- /phonenumbers-sm-j/.gitignore: -------------------------------------------------------------------------------- 1 | *.out 2 | -------------------------------------------------------------------------------- /phonenumbers-sm-j/README.md: -------------------------------------------------------------------------------- 1 | # Build & Run 2 | 3 | ```bash 4 | g++ -std=c++17 phone_number.cpp && ./a.out 5 | ``` 6 | -------------------------------------------------------------------------------- /phonenumbers-sm-j/phone_number.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | bool is_prefix(const string& longer, const string& shorter) { 8 | auto result = std::mismatch(shorter.begin(), shorter.end(), longer.begin()); 9 | if (result.first == shorter.end()) { 10 | return true; 11 | } 12 | return false; 13 | } 14 | 15 | bool solution(vector phone_book) { 16 | for (auto i = 0; i < phone_book.size() - 1; i++) { 17 | for (auto j = i+1; j < phone_book.size(); j++) { 18 | 19 | const auto longer = phone_book[i].size() > phone_book[j].size() ? phone_book[i] : phone_book[j]; 20 | const auto shorter = phone_book[i].size() > phone_book[j].size() ? phone_book[j] : phone_book[i]; 21 | 22 | if (is_prefix(longer, shorter)) { 23 | return false; 24 | } 25 | } 26 | } 27 | return true; 28 | } 29 | 30 | int main(){ 31 | 32 | assert(solution({"119", "97674223", "1195524421"}) == false); 33 | assert(solution({"123", "456", "789"}) == true); 34 | assert(solution({"12", "123", "1235", "567", "88"}) == false); 35 | 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /primenumber-hys-hhj-lyh/primeNumber.kt: -------------------------------------------------------------------------------- 1 | fun primeNumber(arr: IntArray) = 2 | picks(arr) 3 | .map { it.sum() } 4 | .count(isPrimeNumber) 5 | 6 | fun picks(arr: IntArray): Array { 7 | val numbers = arrayListOf() 8 | for (i in 0..arr.size - 3) { 9 | for (j in (i + 1)..arr.size - 2) { 10 | for (k in (j + 1)..arr.size - 1) { 11 | numbers.add(intArrayOf(arr[i], arr[j], arr[k])) 12 | } 13 | } 14 | } 15 | return numbers.toTypedArray() 16 | } 17 | 18 | var isPrimeNumber: (Int) -> Boolean = { it -> 19 | var result = true 20 | for (i in 2 until it) { 21 | if (it % i == 0) { 22 | result = false 23 | } 24 | } 25 | result 26 | } 27 | -------------------------------------------------------------------------------- /primenumber-hys-hhj-lyh/primeNumberTest.kt: -------------------------------------------------------------------------------- 1 | import org.assertj.core.api.Assertions.assertThat 2 | import kotlin.test.Test 3 | 4 | internal class primeNumberTest { 5 | @Test 6 | fun `소수 만들기 테스트`() { 7 | assertThat(primeNumber(intArrayOf(1, 2, 3, 4))).isEqualTo(1) 8 | assertThat(primeNumber(intArrayOf(1, 2, 7, 6, 4))).isEqualTo(4) 9 | } 10 | 11 | @Test 12 | fun `소수 인지 확인하는 함수 테스트`() { 13 | assertThat(isPrimeNumber(1)).isEqualTo(true) 14 | assertThat(isPrimeNumber(2)).isEqualTo(true) 15 | assertThat(isPrimeNumber(4)).isEqualTo(false) 16 | assertThat(isPrimeNumber(9)).isEqualTo(false) 17 | assertThat(isPrimeNumber(11)).isEqualTo(true) 18 | } 19 | 20 | @Test 21 | fun picks() { 22 | assertThat(picks(intArrayOf(1, 2, 3, 4))).isEqualTo( 23 | arrayOf( 24 | intArrayOf(1, 2, 3), 25 | intArrayOf(1, 2, 4), 26 | intArrayOf(1, 3, 4), 27 | intArrayOf(2, 3, 4) 28 | ) 29 | ) 30 | 31 | assertThat(picks(intArrayOf(1, 2, 3, 4, 5))).isEqualTo( 32 | arrayOf( 33 | intArrayOf(1, 2, 3), 34 | intArrayOf(1, 2, 4), 35 | intArrayOf(1, 2, 5), 36 | intArrayOf(1, 3, 4), 37 | intArrayOf(1, 3, 5), 38 | intArrayOf(1, 4, 5), 39 | intArrayOf(2, 3, 4), 40 | intArrayOf(2, 3, 5), 41 | intArrayOf(2, 4, 5), 42 | intArrayOf(3, 4, 5) 43 | ) 44 | ) 45 | } 46 | } -------------------------------------------------------------------------------- /primenumber-khj-sj-joker/primenumber_test.py: -------------------------------------------------------------------------------- 1 | from itertools import combinations 2 | 3 | 4 | def solution(numbers): 5 | return len(prime_cases(numbers)) 6 | 7 | 8 | def prime_cases(numbers): 9 | sorted_numbers = sorted(numbers) 10 | pns = prime_numbers(sorted_numbers) 11 | return [xs for xs in combinations(sorted_numbers, 3) if sum(xs) in pns] 12 | 13 | 14 | def is_prime(xs, sorted_numbers): 15 | return sum(xs) in prime_numbers(sorted_numbers) 16 | 17 | 18 | def prime_numbers(sorted_numbers): 19 | max_number = sum(sorted_numbers[-3:]) 20 | numbers = set(range(2, max_number + 1)) 21 | for i in range(2, max_number + 1): 22 | if i not in numbers: 23 | continue 24 | numbers -= set(range(i * 2, max_number + 1, i)) 25 | return numbers 26 | 27 | 28 | def test_solution(): 29 | assert solution([1, 2, 3, 4]) == 1 30 | assert solution([1, 2, 7, 6, 4]) == 4 31 | 32 | 33 | def test_prime_cases(): 34 | assert prime_cases([1, 2, 3, 4]) == [(1, 2, 4)] 35 | assert prime_cases([1, 2, 7, 6, 4]) == [ 36 | (1, 2, 4), (1, 4, 6), (2, 4, 7), (4, 6, 7) 37 | ] 38 | 39 | 40 | def test_is_prime(): 41 | assert not is_prime((1, 2, 3), [999, 999, 999]) 42 | assert is_prime((1, 2, 4), [999, 999, 999]) 43 | assert not is_prime((1, 0, 0), [999, 999, 999]) 44 | assert is_prime((1, 1, 0), [999, 999, 999]) 45 | assert is_prime((1, 1, 1), [999, 999, 999]) 46 | 47 | 48 | def test_prime_numbers(): 49 | assert prime_numbers([10, 0, 0]) == {2, 3, 5, 7} 50 | -------------------------------------------------------------------------------- /primenumber-kji-lhc/README.md: -------------------------------------------------------------------------------- 1 | # 소수만들기 2 | 3 | ## 문제 설명 4 | 5 | 주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요. 6 | 7 | 8 | ## 제한사항 9 | - nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다. 10 | - nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다. 11 | 12 | ## 문제 풀이 13 | 14 | - 모든 배열을 돌며 중복되지 않는 숫자를 3개씩 뽑는 경우를 찾아 가능한 소수의 갯수를 파악하여 풀었습니다. 15 | - 소수는 2부터 n까지의 반복하며 나누어 떨어지는 값이 현재의 넘버와 같으면 소수로 판별했습니다. 16 | 17 | ## 입출력 예 18 | 19 | |nums|result| 20 | |---|---| 21 | |[1,2,3,4]|1| 22 | |[1,2,7,6,4]|4| 23 | 24 | -------------------------------------------------------------------------------- /primenumber-kji-lhc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "primeNumber-kji-lhc", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "jest": "^24.9.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /primenumber-kji-lhc/primeNumber.test.js: -------------------------------------------------------------------------------- 1 | 2 | const isPrime = (number) => { 3 | for (let i = 2; i <= number; i++) { 4 | if (number % i === 0) { 5 | return i === number ? true : false; 6 | } 7 | } 8 | } 9 | 10 | const countCombination = (arr) => { 11 | const combinations = []; 12 | const length = arr.length; 13 | let numberCheck = null; 14 | for (let i = 0; i < length; i++) { 15 | numberCheck = new Set([arr[i]]); 16 | for (let j = i + 1; j < length; j++) { 17 | if (numberCheck.has(arr[j])) continue; 18 | else numberCheck.add(arr[j]); 19 | for (let k = j + 1; k < length; k++) { 20 | if (numberCheck.has(arr[k])) continue; 21 | else numberCheck.add(arr[k]); 22 | 23 | const set = [arr[i], arr[j], arr[k]].sort((a, b) => a - b).join(','); 24 | 25 | if (!combinations.includes(set)) { 26 | combinations.push(set); 27 | numberCheck = new Set(); 28 | } 29 | } 30 | } 31 | } 32 | 33 | 34 | 35 | return combinations.filter(combination => { 36 | return isPrime( 37 | combination.split(',').reduce((a, b) => Number(a) + Number(b))) 38 | }).length; 39 | }; 40 | 41 | test('should isPrime check', () => { 42 | expect(isPrime(2)).toBe(true); 43 | expect(isPrime(3)).toBe(true); 44 | expect(isPrime(5)).toBe(true); 45 | expect(isPrime(7)).toBe(true); 46 | expect(isPrime(11)).toBe(true); 47 | expect(isPrime(13)).toBe(true); 48 | 49 | expect(isPrime(9)).toBe(false); 50 | expect(isPrime(12)).toBe(false); 51 | expect(isPrime(14)).toBe(false); 52 | expect(isPrime(25)).toBe(false); 53 | expect(isPrime(30)).toBe(false); 54 | 55 | }); 56 | 57 | test('combination set check', () => { 58 | expect(countCombination([1, 2, 3, 4])).toBe(1); 59 | expect(countCombination([1, 2, 7, 6, 4])).toBe(4); 60 | expect(countCombination([1, 2, 3])).toBe(0); 61 | expect(countCombination([1, 2, 3, 4, 5])).toBe(2); 62 | expect(countCombination([2, 4, 6, 7, 9, 10])).toBe(7); 63 | }); -------------------------------------------------------------------------------- /primenumber-kyh-skc/README.md: -------------------------------------------------------------------------------- 1 | # 소수 만들기 2 | [https://programmers.co.kr/learn/courses/30/lessons/12977](https://programmers.co.kr/learn/courses/30/lessons/12977) 3 | 4 | 1. 이해 5 | * input: 숫자의 개수는 3개 이상 50개 이하 6 | * 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다. 7 | * output: 3개의 수를 더했을 때 소수가 되는 경우의 개수 8 | 9 | 2. 계획 10 | 1. 주어진 배열에서 3개를 뽑을 수 있는 경우의 수를 구한다. 11 | 2. 그 각각의 경우의 수를 더한다. 12 | 3. 더한 수를 소수인지 아닌지 검증하고 소수의 갯수를 구한다. 13 | 3. 실행 14 | 15 | 4. 회고 16 | * 시간 내에 풀지 못하였다. 17 | * 3중 for 문을 쓰면 안 된다는 압박감이 있어서 많이 헤맸다. 18 | * 소수인지 검증하는데는 2부터 n의 제곱근까지만 판단하면 된다는것을 배웠다. -------------------------------------------------------------------------------- /primenumber-kyh-skc/primeNumber-kyh-skc.test.js: -------------------------------------------------------------------------------- 1 | const primeNumber = arr => 2 | getCaseOfNumber(arr).filter(number => checkPrimeNumber(number)).length; 3 | 4 | const getCaseOfNumber = arr => { 5 | let results = []; 6 | for (let i = 0; i < arr.length - 2; i++) { 7 | for (let j = i + 1; j < arr.length - 1; j++) { 8 | for (let k = j + 1; k < arr.length; k++) { 9 | results.push(arr[i] + arr[j] + arr[k]); 10 | } 11 | } 12 | } 13 | return results; 14 | }; 15 | 16 | const checkPrimeNumber = number => { 17 | for (let i = 2; i <= Math.sqrt(number); i++) { 18 | if (number % i === 0) return false; 19 | } 20 | return true; 21 | }; 22 | 23 | test("primeNumber", () => { 24 | expect(primeNumber([1, 2, 3, 4])).toBe(1); 25 | expect(primeNumber([1, 2, 7, 6, 4])).toBe(4); 26 | }); 27 | 28 | test("getCaseOfNumber", () => { 29 | expect(getCaseOfNumber([1, 2, 3])).toEqual([6]); 30 | expect(getCaseOfNumber([1, 2, 3, 4])).toEqual([6, 7, 8, 9]); 31 | expect(getCaseOfNumber([1, 2, 3, 4, 5])) 32 | .toEqual([6, 7, 8, 8, 9, 10, 9, 10, 11, 12]); 33 | }); 34 | 35 | test("checkPrimeNumber", () => { 36 | expect(checkPrimeNumber(2)).toBe(true); 37 | expect(checkPrimeNumber(3)).toBe(true); 38 | expect(checkPrimeNumber(4)).toBe(false); 39 | expect(checkPrimeNumber(2342342354)).toBe(false); 40 | expect(checkPrimeNumber(97)).toBe(true); 41 | expect(checkPrimeNumber(71)).toBe(true); 42 | expect(checkPrimeNumber(10)).toBe(false); 43 | }); 44 | -------------------------------------------------------------------------------- /primenumber-sm-sungkm/build.sbt: -------------------------------------------------------------------------------- 1 | libraryDependencies += "com.lihaoyi" %% "utest" % "0.7.2" % "test" 2 | 3 | testFrameworks += new TestFramework("utest.runner.Framework") 4 | -------------------------------------------------------------------------------- /primenumber-sm-sungkm/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.3.4 2 | -------------------------------------------------------------------------------- /primenumber-sm-sungkm/src/main/scala/Prime.scala: -------------------------------------------------------------------------------- 1 | package codingdojo 2 | 3 | object Prime { 4 | 5 | def primes(n: Int): Set[Int] = (2 to n filter isPrime).toSet 6 | 7 | def isPrime(n: Int): Boolean = !primes(math.sqrt(n).toInt).exists(n % _ == 0) 8 | 9 | def sumOfThree(nums: IndexedSeq[Int]): Seq[Int] = for { 10 | i <- 0 until nums.size - 2 11 | j <- i + 1 until nums.size -1 12 | k <- j + 1 until nums.size 13 | } yield nums(i) + nums(j) + nums(k) 14 | 15 | def solve(nums: IndexedSeq[Int]): Int = sumOfThree(nums) count isPrime 16 | 17 | def solution(nums: Vector[Int]): Int = solve(nums) 18 | } 19 | -------------------------------------------------------------------------------- /primenumber-sm-sungkm/src/test/scala/PrimeTest.scala: -------------------------------------------------------------------------------- 1 | package codingdojo 2 | 3 | import Prime._ 4 | 5 | import utest._ 6 | 7 | object PrimeTest extends TestSuite{ 8 | val tests = Tests{ 9 | test("isPrime"){ 10 | test("2") { 11 | assert(isPrime(2)) 12 | } 13 | 14 | test("3") { 15 | assert(isPrime(3)) 16 | } 17 | 18 | test("4") { 19 | assert(!isPrime(4)) 20 | } 21 | 22 | test("5") { 23 | assert(isPrime(5)) 24 | } 25 | test("6") { 26 | assert(!isPrime(6)) 27 | } 28 | test("7") { 29 | assert(isPrime(7)) 30 | } 31 | } 32 | test("sumOfThree"){ 33 | test("[1, 2, 3]") { 34 | val expected = Seq(1 + 2 + 3) 35 | val actual = sumOfThree(IndexedSeq(1, 2, 3)) 36 | assert(actual == expected) 37 | } 38 | test("[1, 2, 3, 4]") { 39 | val expected = Seq(1 + 2 + 3, 1 + 2 + 4, 1 + 3 + 4, 2 + 3 + 4) 40 | val actual = sumOfThree(IndexedSeq(1, 2, 3, 4)) 41 | assert(actual == expected) 42 | } 43 | } 44 | test("solve"){ 45 | test("[1,2,3,4]"){ 46 | assert(solve(IndexedSeq(1, 2, 3, 4)) == 1) 47 | } 48 | test("[1,2,7,6,4]"){ 49 | assert(solve(IndexedSeq(1, 2, 7, 6, 4)) == 4) 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /skilltree-csh-mkh/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | .idea 8 | -------------------------------------------------------------------------------- /skilltree-csh-mkh/README.md: -------------------------------------------------------------------------------- 1 | ## 1. 이해 2 | 3 | - 선행스킬 안에 있는 스킬들은 등장할 땐 반드시 순서대로 배워야 된다. 4 | - 선행스킬 안에 없는 스킬들은 순서에 상관없이 배울 수 있으며 5 | - 선행스킬에 해당하는 스킬들이 반드시 등장해야된다는 제약은 없다. 6 | 7 | ## 2. 계획 8 | 9 | 1. skill에 해당하는 문자를 갖고 있는 문자열만 skill_trees에서 찾아낸다. 10 | 1-1. 찾아낸 결과가 아무 것도 없을 시엔 return + 1 11 | 2. skill의 조합가능한 스킬트리(부분집합)을 모두 구해서 자료구조에 넣어놓는다. 12 | 3. 1에서 추출한 문자열에서 skill(선행스킬)에 해당하는 스킬만 남기고 나머진 지운 문자열을 만든다. 13 | ex) BACDE -> BCD 14 | 4. 3에서 나온 결과를 스킬트리 부분집합에 포함되는지 검사한다. 15 | -------------------------------------------------------------------------------- /skilltree-csh-mkh/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM. 9 | id("org.jetbrains.kotlin.jvm").version("1.3.20") 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving your dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Use the Kotlin JDK 8 standard library. 23 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 24 | 25 | // Use the Kotlin test library. 26 | testImplementation("org.jetbrains.kotlin:kotlin-test") 27 | 28 | // Use the Kotlin JUnit integration. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 30 | 31 | testImplementation("org.assertj:assertj-core:3.11.1") 32 | } 33 | 34 | application { 35 | // Define the main class for the application. 36 | mainClassName = "com.codingdojo.skilltree.AppKt" 37 | } 38 | -------------------------------------------------------------------------------- /skilltree-csh-mkh/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/skilltree-csh-mkh/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /skilltree-csh-mkh/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /skilltree-csh-mkh/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /skilltree-csh-mkh/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.2/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "skilltree-csh-mkh" 11 | -------------------------------------------------------------------------------- /skilltree-csh-mkh/src/test/kotlin/com/codingdojo/skilltree/SolutionTest.kt: -------------------------------------------------------------------------------- 1 | package com.codingdojo.skilltree 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | fun solution(skill: String, skill_trees: Array) = 7 | skill_trees 8 | .map { it.replace("""[^${skill}]""".toRegex(), "") } 9 | .count { 10 | it.startsWith(skill.first()) || it.isBlank() 11 | } 12 | 13 | class SolutionTest { 14 | 15 | @Test 16 | fun `Count available skill tree in a given skill trees`() { 17 | assertThat(solution("CBD", arrayOf("BACDE", "CBADF", "AECB", "BDA"))).isEqualTo(2) 18 | assertThat(solution("ABC", arrayOf("EFG"))).isEqualTo(1) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /skilltree-hhj-hys/SkillTree.kt: -------------------------------------------------------------------------------- 1 | package skillTree 2 | 3 | fun validSkillTreesCount( 4 | skillTree: String, 5 | userSkillTrees: Array 6 | ) = userSkillTrees 7 | .map { it -> it.filter { char -> char in skillTree } } 8 | .count(isPossibleSkillTree(skillTree)) 9 | 10 | fun isPossibleSkillTree(skillTree: String): (String) -> Boolean = { 11 | when { 12 | it == "" -> true 13 | skillTree[0] != it[0] -> false 14 | else -> skillTree.contains(it) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /skilltree-hhj-hys/SkillTreeKtTest.kt: -------------------------------------------------------------------------------- 1 | package skillTree 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | internal class SkillTreeKtTest { 7 | @Test 8 | fun `Skill Tree`() { 9 | assertThat( 10 | validSkillTreesCount( 11 | "CBD", 12 | arrayOf("BACDE", "CBADF", "AECB", "BDA") 13 | ) 14 | ) 15 | .isEqualTo(2) 16 | } 17 | 18 | @Test 19 | fun `isPossibleSkillTreeTest`() { 20 | assertThat(isPossibleSkillTree("CBD", "BCD")).isEqualTo(false) 21 | assertThat(isPossibleSkillTree("CBD", "CBD")).isEqualTo(true) 22 | assertThat(isPossibleSkillTree("CBD", "CB")).isEqualTo(true) 23 | assertThat(isPossibleSkillTree("CBD", "BD")).isEqualTo(false) 24 | assertThat(isPossibleSkillTree("CBDE", "CE")).isEqualTo(false) 25 | assertThat(isPossibleSkillTree("CBDE", "")).isEqualTo(true) 26 | 27 | } 28 | } -------------------------------------------------------------------------------- /skilltree-khj-jjc/skill-tree_test.py: -------------------------------------------------------------------------------- 1 | def solution(skill, skill_trees): 2 | answer = 0 3 | for skill_tree in skill_trees: 4 | if is_valid(skill, skill_tree): 5 | answer += 1 6 | return answer 7 | 8 | 9 | def is_valid(skill, skill_tree): 10 | index_list = [] 11 | for char in skill: 12 | try: 13 | index_list.append(skill_tree.index(char)) 14 | except: 15 | index_list.append(99) 16 | return (sorted(index_list) == index_list) 17 | 18 | 19 | def test_solution(): 20 | assert solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"]) == 2 21 | assert is_valid("CBD", "BACDE") == False 22 | assert is_valid("CBD", "CBADF") == True 23 | assert is_valid("CBD", "AECB") == True 24 | assert is_valid("CBD", "B") == False 25 | assert is_valid("CD", "AF") == True 26 | 27 | -------------------------------------------------------------------------------- /skilltree-lyh-kyh-skc/README.md: -------------------------------------------------------------------------------- 1 | # 스킬트리 2 | 3 | 1. 이해 4 | * 주어진 스킬트리에 순서에 맞게 배울 스킬을 나열한 사람의 수를 구한다. 5 | 스킬틀에 포함되어있지 않은 스킬이면 어디에 들어가도 상관없음. 6 | 7 | * 입력값: 스킬트리, 사용자들이 배우려고하는 스킬순서들 8 | 출력값: 주어진 스킬트리에 순서에 맞게 배울 스킬을 나열한 사람의 수 9 | 10 | 2. 계획 11 | filter 12 | skill = [c, b, d]; 13 | skill_trees.filter((v) => { 14 | return skill.indexOf() 15 | }) 16 | 1. skill을 array로 변환한다. 17 | 2. skill_trees에 있는 원소들을 모두 array로 변경해준다. 18 | 3. 2중 array를 map을 돌면서 filter로 skill에 있는 것만 필터링한다. 19 | 20 | 4. reduce를 써서 필터링된 스킬들이 skill에 contains가 되는 숫자를 얻는다. 21 | 22 | 3. 실행 23 | 24 | 4. 회고 -------------------------------------------------------------------------------- /skilltree-lyh-kyh-skc/skillTree-lyh-kyh-skc.test.js: -------------------------------------------------------------------------------- 1 | // 1. skill을 array로 변환한다. 2 | // 2. skill_trees에 있는 원소들을 모두 array로 변경해준다. 3 | // 3. 2중 array를 map을 돌면서 filter로 skill에 있는 것만 필터링한다. 4 | // 4. reduce를 써서 필터링된 스킬들이 skill에 contains가 되는 숫자를 얻는다. 5 | 6 | const getCorrectSkillCount = (skillTree, skills) => { 7 | const filteredSkill = skills.map(skill => 8 | getFilteredSkill(skillTree, [...skill]).join("") 9 | ); 10 | 11 | return filteredSkill.reduce( 12 | (acc, cur) => skillTree.startsWith(cur) ? acc + 1 : acc, 13 | 0 14 | ); 15 | }; 16 | 17 | const getFilteredSkill = (skillTree, skillArray) => 18 | skillArray.filter(v => skillTree.includes(v)); 19 | 20 | test("getCorrectSkillCount", () => { 21 | expect(getCorrectSkillCount("CBD", ["BACDE", "CBADF", "AECB", "BDA"])).toBe( 22 | 2 23 | ); 24 | }); 25 | 26 | test("getFilteredSkill", () => { 27 | expect(getFilteredSkill(["C", "B", "D"], ["B", "A", "C", "D", "E"])).toEqual([ 28 | "B", 29 | "C", 30 | "D" 31 | ]); 32 | }); 33 | -------------------------------------------------------------------------------- /skilltree-sm-j-joker/skilltree.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | using namespace std; 10 | using namespace std::placeholders; 11 | 12 | #define assert_equal(expected, actual) \ 13 | _assert_equal(__LINE__, expected, actual) 14 | 15 | void _assert_equal(int line, int expected, int actual) { 16 | if (expected == actual) { 17 | return; 18 | } 19 | 20 | cout << "NOT EQUAL(" << line << ")" << endl 21 | << "expected: " << expected << endl 22 | << "actual: " << actual << endl; 23 | } 24 | 25 | bool learn_skill(string skill_tree, char skill, vector& learned) { 26 | size_t pos = skill_tree.find(skill); 27 | if (pos == string::npos) { 28 | return true; 29 | } 30 | if (pos > 0 && !learned[pos - 1]) { 31 | return false; 32 | } 33 | 34 | learned[pos] = true; 35 | return true; 36 | } 37 | 38 | bool check_skills(string skill_tree, string skills) { 39 | vector learned('Z' - 'A' + 1); 40 | for (size_t i = 0; i < skills.size(); i++) { 41 | if (!learn_skill(skill_tree, skills[i], learned)) { 42 | return false; 43 | } 44 | } 45 | return true; 46 | } 47 | 48 | int solution(string skill_tree, vector skillses) { 49 | return count_if(skillses.begin(), skillses.end(), 50 | bind(check_skills, skill_tree, _1)); 51 | //return count_if(skillses.begin(), skillses.end(), 52 | // [=](auto skills) { return check_skills(skill_tree, skills); }); 53 | } 54 | 55 | int main() { 56 | assert_equal(2, solution("CBD", { "BACDE", "CBADF", "AECB", "BDA" })); 57 | assert_equal(false, check_skills("CBD", "BACDE")); 58 | assert_equal(true, check_skills("CBD", "CBADF")); 59 | assert_equal(true, check_skills("CBD", "AECB")); 60 | assert_equal(true, check_skills("CBD", "CBD")); 61 | return 0; 62 | } 63 | -------------------------------------------------------------------------------- /trucks-csh-hhj/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | 7 | .idea 8 | -------------------------------------------------------------------------------- /trucks-csh-hhj/README.md: -------------------------------------------------------------------------------- 1 | # [다리를 지나는 트럭](https://programmers.co.kr/learn/courses/30/lessons/42583?language=kotlin) 2 | 3 | ## 1. 이해 4 | 5 | - 트럭은 1초에 1만큼 움직임. 6 | - 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않음. 7 | - 다리 길이는 bridge_length, 다리는 무게 weight까지 견딤. 8 | - 모든 트럭의 무게는 1 이상 weight 이하 -> 적어도 1대는 지나갈 수 있다. 9 | 10 | ## 2. 계획 11 | 12 | 1. 대기트럭에서 다리 위로 트럭 1대를 올린다. 13 | 1-1. 다리 위의 트럭 무게의 합 <= weight 일 때 트럭을 올릴 수 있다. 14 | 2. 다리를 건너는데 걸리는 시간은 bridge_length만큼 소요된다. 15 | 3. 다리에 트럭이 올라가는 순간부터 트럭마다 다리에 머무른 시간 초기화해주고 누산한다. 16 | 3-1. 1초가 지날 때마다 다리 위 모든 트럭의 머문 시간을 +1씩 해준다. 17 | 4. 다리 위 맨 앞에 있는 트럭의 머무른 시간이 bridge_length와 같다면 다리를 탈출. total += 1. 18 | 4-1. 탈출과 동시에 다리 위 트럭 무게의 총합을 다시 계산한다. 19 | 4-2. 1-1로 돌아가서 다시 진행. 20 | 4-3. 만약 탈출 조건에 맞지 않는다면 전체 시간 total += 1. 21 | 5. 다리 위에 있는 트럭과 대기열에 있는 트럭이 없어지기 전까지 위의 과정을 계속 반복한다. 22 | 23 | ## 3. 실행 24 | 25 | ## 4. 반성 26 | -------------------------------------------------------------------------------- /trucks-csh-hhj/build.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * This generated file contains a sample Kotlin application project to get you started. 5 | */ 6 | 7 | plugins { 8 | // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM. 9 | id("org.jetbrains.kotlin.jvm").version("1.3.20") 10 | 11 | // Apply the application plugin to add support for building a CLI application. 12 | application 13 | } 14 | 15 | repositories { 16 | // Use jcenter for resolving your dependencies. 17 | // You can declare any Maven/Ivy/file repository here. 18 | jcenter() 19 | } 20 | 21 | dependencies { 22 | // Use the Kotlin JDK 8 standard library. 23 | implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 24 | 25 | // Use the Kotlin test library. 26 | testImplementation("org.jetbrains.kotlin:kotlin-test") 27 | 28 | // Use the Kotlin JUnit integration. 29 | testImplementation("org.jetbrains.kotlin:kotlin-test-junit") 30 | 31 | testImplementation("org.assertj:assertj-core:3.11.1") 32 | } 33 | 34 | application { 35 | // Define the main class for the application. 36 | mainClassName = "com.codingdojo.trucks.AppKt" 37 | } 38 | -------------------------------------------------------------------------------- /trucks-csh-hhj/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dal-lab/coding-dojo/33872c2f68a2dde8ea2d811108f1fd1167ce0738/trucks-csh-hhj/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /trucks-csh-hhj/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /trucks-csh-hhj/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS='"-Xmx64m"' 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /trucks-csh-hhj/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /trucks-csh-hhj/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.2/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = "trucks-csh-hhj" 11 | -------------------------------------------------------------------------------- /trucks-csh-hhj/src/test/kotlin/com/codingdojo/trucks/SolutionTest.kt: -------------------------------------------------------------------------------- 1 | package com.codingdojo.trucks 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | fun solution1(bridge_length: Int, weight: Int, truck_weights: IntArray): Int { 7 | val trucksOnBridge = mutableListOf>() 8 | var total = 0 9 | val waitingTrucks = truck_weights.toMutableList() 10 | 11 | while (trucksOnBridge.isNotEmpty() || waitingTrucks.isNotEmpty()) { 12 | if (trucksOnBridge.firstOrNull()?.second == bridge_length) { 13 | trucksOnBridge.removeAt(0) 14 | } 15 | 16 | if (waitingTrucks.isNotEmpty() && trucksOnBridge.sumBy { it.first } + waitingTrucks.first() <= weight) { 17 | trucksOnBridge.add(Pair(waitingTrucks.first(), 0)) 18 | waitingTrucks.removeAt(0) 19 | } 20 | 21 | for (i in 0 until trucksOnBridge.size) { 22 | trucksOnBridge[i] = Pair(trucksOnBridge[i].first, trucksOnBridge[i].second + 1) 23 | } 24 | 25 | total += 1 26 | } 27 | 28 | return total 29 | } 30 | 31 | fun solution2(bridge_length: Int, weight: Int, truck_weights: IntArray): Int { 32 | tailrec fun step(weight: Int, truck_weights: List, bridges: List, total: Int): Int = when { 33 | bridges.sum() == 0 && truck_weights.isEmpty() -> total 34 | shift(bridges).ready(weight, truck_weights) -> step(weight, truck_weights.drop(1), shift(bridges) + truck_weights.first(), total + 1) 35 | else -> step(weight, truck_weights, shift(bridges) + 0, total + 1) 36 | } 37 | 38 | return step(weight, truck_weights.toList(), List(bridge_length) { 0 }, 0) 39 | } 40 | 41 | fun Collection.ready(weight: T, truck_weights: List) = 42 | truck_weights.isNotEmpty() && (sum() + truck_weights.first()) <= weight 43 | 44 | fun shift(bridges: List) = bridges.drop(1) 45 | 46 | class SolutionTest { 47 | 48 | @Test 49 | fun `Find the time it takes for all trucks to cross the bridge`() { 50 | arrayOf(::solution1, ::solution2).forEach { solution -> 51 | assertThat(solution(2, 10, intArrayOf(7))).isEqualTo(3) 52 | assertThat(solution(2, 10, intArrayOf(7, 4))).isEqualTo(5) 53 | assertThat(solution(2, 10, intArrayOf(7, 4, 5, 6))).isEqualTo(8) 54 | assertThat(solution(100, 100, intArrayOf(10))).isEqualTo(101) 55 | assertThat(solution(100, 100, intArrayOf(10, 10, 10, 10, 10, 10, 10, 10, 10, 10))).isEqualTo(110) 56 | } 57 | } 58 | 59 | @Test 60 | fun `Check if the truck is ready to cross the bridge`() { 61 | assertThat(listOf(7).ready(10, listOf(4))).isEqualTo(false) 62 | } 63 | 64 | @Test 65 | fun `The truck moves on the bridge`() { 66 | assertThat(shift(listOf(0, 0, 7))).isEqualTo(listOf(0, 7)) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /trucks-joker/trucks_test.py: -------------------------------------------------------------------------------- 1 | def solution(length, weight, trucks): 2 | seconds = 0 3 | bridges = [0] * length 4 | while sum(bridges) or trucks: 5 | bridges = shift(bridges) 6 | if ready(weight, bridges, trucks): 7 | bridges, trucks = go(bridges, trucks) 8 | seconds += 1 9 | return seconds 10 | 11 | 12 | def shift(xs): 13 | return xs[1:] + [0] 14 | 15 | 16 | def ready(weight, bridges, trucks): 17 | return trucks and sum(bridges) + trucks[0] <= weight 18 | 19 | 20 | def go(bridges, trucks): 21 | return bridges[:-1] + trucks[:1], trucks[1:] 22 | 23 | 24 | def test_sample(): 25 | assert solution(2, 10, [7, 4, 5, 6]) == 8 26 | assert solution(100, 100, [10]) == 101 27 | assert solution(100, 100, [10] * 10) == 110 28 | 29 | 30 | def test_check(): 31 | assert not ready(10, [0, 0, 0, 7], [4, 5, 6]) 32 | 33 | 34 | def test_go(): 35 | assert go([0, 0, 7, 0], [3, 1]) == ([0, 0, 7, 3], [1]) 36 | 37 | 38 | def test_shift(): 39 | assert shift([0, 0, 7, 0]) == [0, 7, 0, 0] 40 | -------------------------------------------------------------------------------- /trucks-khj-kyh-skc/README.md: -------------------------------------------------------------------------------- 1 | # 1. 이해 2 | 3 | - 충분함 4 | 5 | # 2. 계획 6 | 7 | - 다리 길이만큼 배열을 만든다. 0으로 꽉 채운. 8 | - 현재 다리에 올라와있는 트럭의 무게를 저장하는 값과 지금 내가 넣을 트럭의 합이 제한 무게를 넘지 않는지 체크한다. 9 | - 넘지 않으면 대기 트럭에 있는 첫 번째 트럭을 push, 다리에서도 shift. 그리고 대기 트럭에서도 shift 10 | - 넘으면 0을 push 하고 다리 배열에서 shift. 그 값을 총 합에서 빼준다. 11 | 12 | # 3. 실행 13 | 14 | # 4. 반성 15 | -------------------------------------------------------------------------------- /trucks-khj-kyh-skc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "trucks-khj-kyh-skc", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@types/jest": "^25.1.2", 14 | "jest": "^25.1.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /trucks-khj-kyh-skc/trucks.test.js: -------------------------------------------------------------------------------- 1 | const solution = (bridge_length, weight, truck_weights) => { 2 | let bridge = Array(bridge_length).fill(0); 3 | let sumOfWeight = 0; 4 | let watingTrucks = [...truck_weights]; 5 | let second = 0; 6 | 7 | while (sumOfWeight || watingTrucks.length) { 8 | const passTruck = bridge.shift(); 9 | 10 | sumOfWeight -= passTruck; 11 | 12 | let shiftTruck = 0; 13 | 14 | if (sumOfWeight + watingTrucks[0] <= weight) { 15 | shiftTruck = watingTrucks.shift(); 16 | sumOfWeight += shiftTruck; 17 | } 18 | 19 | bridge.push(shiftTruck); 20 | 21 | second++; 22 | } 23 | 24 | return second; 25 | }; 26 | 27 | test("solution", () => { 28 | expect(solution(2, 10, [7, 4, 5, 6])).toBe(8); 29 | expect(solution(100, 100, [10, 10, 10, 10, 10, 10, 10, 10, 10, 10])).toBe( 30 | 110 31 | ); 32 | expect(solution(100, 100, [10])).toBe(101); 33 | }); 34 | --------------------------------------------------------------------------------