├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── csharp ├── .gitignore └── rgb-distance │ ├── RGB.cs │ ├── RGB.csproj │ └── RGBTest.cs ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── haskell ├── build.gradle ├── haskell.cabal ├── src │ └── main │ │ └── haskell │ │ ├── aircon │ │ └── Main.hs │ │ ├── angryProfessor │ │ └── Main.hs │ │ ├── birthdayChocolate │ │ └── Main.hs │ │ ├── helloworld │ │ └── Main.hs │ │ ├── lilysHomework │ │ └── Main.hs │ │ ├── noscenariobaseball │ │ └── Main.hs │ │ ├── programmers │ │ ├── Main.hs │ │ └── Main2.hs │ │ ├── simpleBalancedParentheses │ │ └── Main.hs │ │ ├── stringzip │ │ └── Main.hs │ │ ├── sugardelivery │ │ └── Main.hs │ │ └── triplestep │ │ └── Main.hs └── stack.yaml ├── java ├── build.gradle └── src │ └── main │ └── java │ ├── AngryProfessor.java │ ├── BirthdayChocolate.java │ ├── BirthdayChocolate_2.java │ ├── BreakingTheRecords.java │ ├── HelloWorld.java │ ├── LilysHomework.java │ ├── Lotto.java │ └── Programmers.java ├── javascript ├── build.gradle └── src │ └── scripts │ ├── AfterParty.js │ ├── DigitalRoot.js │ ├── HelloWorld.js │ ├── RecordCounter.js │ └── SimpleBalancedParentheses.js ├── kotlin ├── build.gradle └── src │ └── main │ └── kotlin │ ├── AfterParty.kt │ ├── Aircondition.kt │ ├── AngryTeacher.kt │ ├── BaseBall.kt │ ├── DigitalRoot.kt │ ├── DrawRect.kt │ ├── ElectronicSaveAircon.kt │ ├── FindLargestSquare.kt │ ├── HelloWorld.kt │ ├── LengthOfLongestSubstring.kt │ ├── LilyHomework.kt │ ├── LongestSubstring.kt │ ├── LongestSubstringFromChanHo.kt │ ├── Lotto.kt │ ├── Maraton.kt │ ├── PriyankaAndToys.kt │ ├── Programmers.kt │ ├── RefreshRecord.kt │ ├── Saddlepoint.kt │ ├── SimpleBalancedParentheses.kt │ ├── StreetRgb.kt │ └── SugarDelivery.kt ├── scala ├── .gitignore ├── build.gradle ├── build.sbt ├── project │ └── build.properties └── src │ └── main │ └── scala │ ├── HelloWorld.scala │ ├── RGBDistance.scala │ ├── RgbDistance2.scala │ └── SaddlePoints.scala ├── settings.gradle └── swift ├── DigitalRoot ├── DigitalRoot.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcuserdata │ │ └── MBKWON.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ └── DigitalRoot.xcscheme └── DigitalRoot │ └── main.swift ├── DrawRect ├── DrawRect.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── sam.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcuserdata │ │ └── sam.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ ├── DrawRect.xcscheme │ │ └── xcschememanagement.plist └── DrawRect │ ├── Extensions.swift │ └── main.swift ├── HelloSwift ├── HelloSwift.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcuserdata │ │ └── MBKWON.xcuserdatad │ │ └── xcschemes │ │ └── HelloSwift.xcscheme └── HelloSwift │ └── main.swift └── PriyankaAndToys ├── PriyankaAndToys.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── MBKWON.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── PriyankaAndToys.xcscheme └── PriyankaAndToys └── main.swift /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled source # 2 | ################### 3 | *.com 4 | *.class 5 | *.dll 6 | *.exe 7 | *.o 8 | *.so 9 | 10 | # Packages # 11 | ############ 12 | # it's better to unpack these files and commit the raw source 13 | # git has its own built in compression methods 14 | *.7z 15 | *.dmg 16 | *.gz 17 | *.iso 18 | *.jar 19 | *.rar 20 | *.tar 21 | *.zip 22 | 23 | # Logs and databases # 24 | ###################### 25 | *.log 26 | 27 | # OS generated files # 28 | ###################### 29 | .DS_Store* 30 | ehthumbs.db 31 | Icon? 32 | Thumbs.db 33 | 34 | # Editor Files # 35 | ################ 36 | *~ 37 | *.swp 38 | 39 | # Build output directies 40 | /target 41 | */target 42 | /build 43 | */build 44 | 45 | # IntelliJ specific files/directories 46 | out 47 | .idea 48 | *.ipr 49 | *.iws 50 | *.iml 51 | atlassian-ide-plugin.xml 52 | 53 | # Eclipse specific files/directories 54 | .classpath 55 | .project 56 | .settings 57 | .metadata 58 | 59 | # NetBeans specific files/directories 60 | .nbattrs 61 | 62 | # Gradle Files # 63 | ################ 64 | .gradle 65 | .m2 66 | gradle-app.setting 67 | !gradle-wrapper.jar 68 | .gradletasknamecache 69 | 70 | # Haskell 71 | dist 72 | dist-* 73 | cabal-dev 74 | *.hi 75 | *.chi 76 | *.chs.h 77 | *.dyn_o 78 | *.dyn_hi 79 | .hpc 80 | .hsenv 81 | .cabal-sandbox/ 82 | cabal.sandbox.config 83 | *.prof 84 | *.aux 85 | *.hp 86 | *.eventlog 87 | .stack-work/ 88 | cabal.project.local 89 | .HTF/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 funfunStudy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # algorithm 2 | 알고리즘 풀이 3 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | 2 | subprojects { 3 | group = "funfunstudy" 4 | 5 | repositories { 6 | mavenCentral() 7 | } 8 | 9 | dependencies { 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /csharp/.gitignore: -------------------------------------------------------------------------------- 1 | **/.vscode/ 2 | **/obj/ 3 | **/bin/ -------------------------------------------------------------------------------- /csharp/rgb-distance/RGB.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using Houses = System.Collections.Generic.IEnumerable>; 5 | 6 | public class RGB 7 | { 8 | readonly Houses houses; 9 | 10 | public RGB(Houses rgbList) 11 | { 12 | this.houses = rgbList; 13 | } 14 | 15 | public int MinimumValue() 16 | { 17 | var first = houses.First().ToList(); // 검사할 첫번째 배열을 담는다. 18 | var remains = houses.Skip(1); // 첫번째 배열을 제외한다. 19 | 20 | // 첫번째 배열의 RGB 순서대로 검사하면서 리스트에 추가한다. 21 | // R 기준 최소 값, G 기준 최소 값, B 기준 최소 값 을 구해 최소 값을 리턴한다. 22 | return ( 23 | from color in first 24 | select FindMinValue(first.IndexOf(color), color, remains) 25 | ).Min(); 26 | } 27 | 28 | //rgb = 기준이 되는 R,G,B 타입, price = 최종 비용, list = 검사 될 RGB 배열 29 | private int FindMinValue(int rgb, int price, Houses list) 30 | { 31 | if (list.Count() == 0) 32 | return price; 33 | 34 | var first = list.First().ToList(); // 검사할 첫번째 배열을 담는다. 35 | var remains = list.Skip(1); // 첫번째 배열을 제외한다. 36 | 37 | return ( 38 | from index in Enumerable.Range(rgb + 1, 2).Select(v => v % 3) 39 | select FindMinValue(index, price + first[index], remains) 40 | ).Min(); 41 | } 42 | } -------------------------------------------------------------------------------- /csharp/rgb-distance/RGB.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /csharp/rgb-distance/RGBTest.cs: -------------------------------------------------------------------------------- 1 | using Xunit; 2 | using System.Collections.Generic; 3 | 4 | public class RGBTest 5 | { 6 | [Fact] 7 | public void Rgb_distance_case1() 8 | { 9 | var rgbList = new List(){ 10 | (new int[]{26, 40, 83}), 11 | (new int[]{49, 60, 57}), 12 | (new int[]{13, 89, 99}) 13 | }; 14 | 15 | var rgb = new RGB(rgbList); 16 | Assert.Equal(96, rgb.MinimumValue()); 17 | } 18 | 19 | [Fact] 20 | public void Rgb_distance_case2() 21 | { 22 | var rgbList = new List(){ 23 | (new int[]{1, 20, 30}), 24 | (new int[]{50, 5, 6}), 25 | (new int[]{9, 3, 7}) 26 | }; 27 | 28 | var rgb = new RGB(rgbList); 29 | Assert.Equal(10, rgb.MinimumValue()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funfunStudy/algorithm/a207e4db320e8126169154aa1a7a96a58c71785f/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Jun 08 23:28:37 KST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip 7 | -------------------------------------------------------------------------------- /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="" 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 | -------------------------------------------------------------------------------- /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= 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 | -------------------------------------------------------------------------------- /haskell/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | buildscript { 3 | repositories { 4 | mavenCentral() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.prezi.haskell:gradle-haskell-plugin:0.4+' 9 | } 10 | } 11 | 12 | apply plugin: 'haskell' 13 | 14 | haskell { 15 | ghcVersion = "ghc-8.0.1" 16 | snapshotId = "lts-7.0" 17 | isExecutable = true 18 | } -------------------------------------------------------------------------------- /haskell/haskell.cabal: -------------------------------------------------------------------------------- 1 | name: algorithm-haskell 2 | version: 1.0.0.0 3 | author: Joe Cho 4 | maintainer: goinhacker@gmail.com 5 | build-type: Simple 6 | cabal-version: >=1.10 7 | 8 | executable helloworld 9 | main-is: Main.hs 10 | hs-source-dirs: src/main/haskell/helloworld 11 | build-depends: base 12 | default-language: Haskell2010 13 | 14 | executable simpleBalancedParentheses 15 | main-is: Main.hs 16 | hs-source-dirs: src/main/haskell/simpleBalancedParentheses 17 | build-depends: base 18 | default-language: Haskell2010 19 | 20 | --executable saddlePoint 21 | -- main-is: Main.hs 22 | -- hs-source-dirs: src/main/haskell/saddlepoint 23 | -- build-depends: base 24 | -- default-language: Haskell2010 25 | 26 | executable noscenariobaseball 27 | main-is: Main.hs 28 | hs-source-dirs: src/main/haskell/noscenariobaseball 29 | build-depends: base 30 | default-language: Haskell2010 31 | 32 | executable aircon 33 | main-is: Main.hs 34 | hs-source-dirs: src/main/haskell/aircon 35 | build-depends: base 36 | default-language: Haskell2010 37 | 38 | executable sugerdelivery 39 | main-is: Main.hs 40 | hs-source-dirs: src/main/haskell/sugardelivery 41 | build-depends: base 42 | default-language: Haskell2010 43 | 44 | executable birthdayChocolate 45 | main-is: Main.hs 46 | hs-source-dirs: src/main/haskell/birthdayChocolate 47 | build-depends: base 48 | default-language: Haskell2010 49 | 50 | executable triplestep 51 | main-is: Main.hs 52 | hs-source-dirs: src/main/haskell/triplestep 53 | build-depends: base 54 | default-language: Haskell2010 55 | 56 | executable stringzip 57 | main-is: Main.hs 58 | hs-source-dirs: src/main/haskell/stringzip 59 | build-depends: base 60 | default-language: Haskell2010 61 | 62 | executable programmers 63 | main-is: Main.hs 64 | hs-source-dirs: src/main/haskell/programmers 65 | build-depends: base 66 | default-language: Haskell2010 67 | 68 | executable programmers2 69 | main-is: Main2.hs 70 | hs-source-dirs: src/main/haskell/programmers 71 | build-depends: base 72 | default-language: Haskell2010 73 | -------------------------------------------------------------------------------- /haskell/src/main/haskell/aircon/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | main :: IO () 4 | main = do 5 | print $ check 90 [10, 10, 10, 10, 10, 10, 10, 10, 10] 6 | print $ check 1000 [77, 77, 70, 11, 34, 35, 41, 83, 54] 7 | print $ check 50 [10, 20, 30, 40, 50, 60, 50, 40, 30] 8 | 9 | 10 | check :: Int -> [Int] -> String 11 | check a list = if sum list > a then "NO" else "YES" -------------------------------------------------------------------------------- /haskell/src/main/haskell/angryProfessor/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | main:: IO () 4 | main = do 5 | check 6 | putStrLn $ show "Hello??" 7 | 8 | checkNum :: Num a => [a] -> Int -> Bool 9 | checkNum [] _ = False 10 | checkNum xs limit = let x = length $ filter (\ x -> x >= 0) xs in x > limit -------------------------------------------------------------------------------- /haskell/src/main/haskell/birthdayChocolate/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | solution::[Int] -> Int -> Int -> Int -> Int 4 | solution l sm p r = if length l < p 5 | then r 6 | else 7 | if (sum $ take p l) == sm 8 | then solution (drop 1 l) sm p (r + 1) 9 | else solution (drop 1 l) sm p r 10 | 11 | solution2::[Int] -> Int -> Int -> Int -> Int 12 | solution2 list@(_:xs) sm p r = 13 | if length list < p 14 | then r 15 | else 16 | if (sum $ take p list) == sm 17 | then solution xs sm p (r + 1) 18 | else solution xs sm p r 19 | 20 | main :: IO () 21 | main = do 22 | putStrLn $ show (solution [1, 2, 1, 3, 2] 3 2 0) 23 | putStrLn $ show (solution2 [1, 2, 1, 3, 2] 3 2 0) 24 | 25 | 26 | -- tailrec fun result(list: List, result: Int) : Int { 27 | -- if(list.size > itemCnt){ 28 | -- if(list.take(itemCnt).sum == result){ 29 | -- result(list.drop(itemCnt), result +1) 30 | -- } else { 31 | -- result(list.drop(itemCnt), result) 32 | -- } 33 | -- } else { 34 | -- result 35 | -- } 36 | -- }: 37 | 38 | 39 | -------------------------------------------------------------------------------- /haskell/src/main/haskell/helloworld/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | main :: IO () 4 | main = do 5 | getLine 6 | interact (unlines . map hello . lines) 7 | 8 | hello :: String -> String 9 | hello = ("Hello, " ++) . (++ "!") -------------------------------------------------------------------------------- /haskell/src/main/haskell/lilysHomework/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | minIdx :: [Int] -> Int -> Int 4 | minIdx (x:[]) idx = idx 5 | minIdx (x:xs) idx = if x < minimum xs then idx else (minIdx xs (idx + 1)) 6 | 7 | maxIdx :: [Int] -> Int -> Int 8 | maxIdx (x:[]) idx = idx 9 | maxIdx (x:xs) idx = if x > maximum xs then idx else (maxIdx xs (idx + 1)) 10 | 11 | swap :: [Int] -> Int -> [Int] 12 | swap [] _ = [] 13 | swap (x:xs) 0 = xs 14 | swap (x:xs) a = take (a-1) xs ++ [x] ++ drop a xs 15 | 16 | solutionMin :: [Int] -> Int -> Int 17 | solutionMin [] a = a 18 | solutionMin l a = let min = minIdx l 0; cnt = if min > 0 then a + 1 else a in solutionMin (swap l min) cnt 19 | 20 | solutionMax :: [Int] -> Int -> Int 21 | solutionMax [] a = a 22 | solutionMax l a = let max = maxIdx l 0; cnt = if max > 0 then a + 1 else a in solutionMax (swap l max) cnt 23 | 24 | solution :: [Int] -> Int 25 | solution [] = 0 26 | solution l = minimum ((solutionMin l 0):(solutionMax l 0):[]) 27 | 28 | --isSorted :: (Int -> Int -> Bool) -> [Int] -> Bool 29 | --isSorted f [] = True 30 | --isSorted f (_:[]) = True 31 | --isSorted f (x:y:xs) = (f x y) && isSorted f (y:xs) 32 | 33 | --isDecSorted xs = isSorted (<) xs 34 | --isAscSorted xs = isSorted (>) xs 35 | 36 | main :: IO () 37 | main = do 38 | print $ minIdx [3, 2, 4] 0 39 | print $ minIdx [1, 2, 3] 0 40 | print $ minIdx [5, 3, 2] 0 41 | print $ swap [3,5,2,6,1] 0 42 | print $ swap [3,5,2,6,1] 1 43 | print $ swap [3,5,2,6,1] 2 44 | print $ swap [3,5,2,6,1] 3 45 | print $ swap [3,5,2,6,1] 4 46 | -- print $ isDecSorted [3,5,2,6,1] 47 | -- print $ isDecSorted [1,2,3,4] 48 | -- print $ isAscSorted [3,5,2,6,1] 49 | -- print $ isAscSorted [4,3,2,1] 50 | -- print $ isAscSorted [1,2,3,4] 51 | print $ maxIdx [3,5,2,6,1] 0 52 | print $ solutionMin [3,5,2,6,1] 0 53 | print $ solutionMax [3,5,2,6,1] 0 54 | print $ solution [3,5,2,6,1] -------------------------------------------------------------------------------- /haskell/src/main/haskell/noscenariobaseball/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | main :: IO () 4 | main = do 5 | print $ check 5 5 0 6 | print $ check 4 5 0 7 | print $ check 6 4 0 8 | 9 | 10 | check :: Int -> Int -> Int -> Int 11 | check a b acc = if a > b then (if 0 == acc then acc else acc + 3) else check (a + 1) b (acc + 1) 12 | -------------------------------------------------------------------------------- /haskell/src/main/haskell/programmers/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | solution :: [Int] -> [Int] -> [Int] 4 | solution p s = innerSolution (zip p s) [] 5 | 6 | innerSolution :: [(Int, Int)] -> [Int] -> [Int] 7 | innerSolution [] acc = reverse acc 8 | innerSolution ps acc 9 | | 0 < finishCount = innerSolution (drop finishCount ps) (finishCount:acc) 10 | | otherwise = innerSolution (oneDay ps) acc 11 | where finishCount = length $ takeWhile (\x -> fst x >= 100) ps 12 | 13 | oneDay :: [(Int, Int)] -> [(Int, Int)] 14 | oneDay list = map up list 15 | where up = \t -> (fst t + snd t, snd t) 16 | 17 | main :: IO() 18 | main = do 19 | print $ solution [93, 30, 55] [1, 30, 5] 20 | -------------------------------------------------------------------------------- /haskell/src/main/haskell/programmers/Main2.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Data.List 4 | -- progresses speeds return 5 | --[93,30,55] [1,30,5] [2,1] 6 | 7 | --[94, 60, 60] 8 | --[95, 90, 65] 9 | --[96, 120, 70] 10 | --[97, 120, 75] 11 | --[98, 120, 80] 12 | --[99, 120, 85] 13 | --[100, 120, 90] -> 2 14 | --[100, 120, 95] 15 | --[100, 120, 100] -> 1 16 | 17 | main:: IO() 18 | main = do 19 | print [fst prog + speed | prog <- zip [93, 30, 55] [0..], 20 | let speed = [1, 30, 5] !! snd prog] 21 | print $ doDay [93, 30, 55] [1,30,5] [] 22 | print $ solution2 [93,30,55] [1,30,5] 23 | 24 | doDay::[Int]->[Int]->[Int]->[Int] 25 | doDay [] [] acc = reverse acc 26 | doDay p s acc = let dt = map (\(a,b)->a+b) (zip p s) 27 | finCnt = length $ takeWhile (>=100) dt 28 | in 29 | if finCnt == 0 30 | then doDay dt s acc 31 | else doDay (drop finCnt dt) (drop finCnt s) (finCnt:acc) 32 | 33 | solution2::[Int]->[Int]->[Int] 34 | solution2 p s = let dt = map (\(a,b)-> ceiling ((realToFrac (100 - a)) / (realToFrac b))) (zip p s) 35 | in map (\a -> length a) $ groupBy (\a b -> a >= b) dt 36 | -------------------------------------------------------------------------------- /haskell/src/main/haskell/simpleBalancedParentheses/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | main :: IO () 4 | main = do 5 | line <- getLine 6 | putStrLn $ if checkBalance line 0 then "TRUE" else "FALSE" 7 | 8 | checkBalance :: String -> Int -> Bool 9 | checkBalance [] n = 0 == n 10 | checkBalance [x] n = if 0 > n then False else True 11 | checkBalance (x:xs) n 12 | | x == '(' = checkBalance xs (n + 1) 13 | | otherwise = checkBalance xs (n - 1) -------------------------------------------------------------------------------- /haskell/src/main/haskell/stringzip/Main.hs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | zipStr :: String -> Char -> Int -> String 5 | zipStr [] ch count = ch:[] ++ (show count) 6 | zipStr (x:xs) ch count = if x == ch then zipStr xs ch (count+1) else ch:[] ++ (show count) ++ (zipStr (x:xs) x 0) 7 | 8 | main :: IO() 9 | main = do 10 | print $ zipStr "hello" 'h' 0 -------------------------------------------------------------------------------- /haskell/src/main/haskell/sugardelivery/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | main :: IO () 4 | main = do 5 | print $ solve (62 `div` 5) (62 `mod` 5) 6 | print $ solve (18 `div` 5) (18 `mod` 5) 7 | print $ solve (4 `div` 5) (4 `mod` 5) 8 | print $ solve (6 `div` 5) (6 `mod` 5) 9 | print $ solve (9 `div` 5) (9 `mod` 5) 10 | print $ solve (11 `div` 5) (11 `mod` 5) 11 | 12 | solve :: (Integral a) => a -> a -> a 13 | solve x _ 14 | | -1 == x = -1 15 | solve x r = if 0 == r `mod` 3 then r `div` 3 + x else solve (x-1) (r+5) -------------------------------------------------------------------------------- /haskell/src/main/haskell/triplestep/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | -- 어떤 아이가 n개의 계단을 오른다. 한 번에 1계단 오르기도 하고, 2계단이나 3계단을 오르기도 한다. 계단을 오르는 방법이 몇 가지가 있는지 계산하는 메서드를 구현하라. (추가로, 시간복잡도는 얼마인지 생각해보자) 4 | -- f(N) = f(N - 1) + f(N - 2) + f(N - 3) 5 | 6 | solution :: Int -> Int 7 | solution 0 = 1 8 | solution 1 = 1 9 | solution n = solution(n - 1) + solution(n - 2) + solution(n - 3) 10 | 11 | main :: IO() 12 | main = do 13 | -- print "Hello" 14 | print $ solution(6) 15 | -------------------------------------------------------------------------------- /haskell/stack.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - . 3 | resolver: ghc-8.0.1 4 | 5 | extra-package-dbs: [] 6 | extra-deps: [] 7 | local-bin-path: /Users/wodydjjang/dev/funfun/algorithm/haskell/build/sandbox/files/bin -------------------------------------------------------------------------------- /java/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | sourceCompatibility = 1.8 4 | 5 | dependencies { 6 | compile 'ch.qos.logback:logback-classic:1.2.3' 7 | compile 'ch.qos.logback:logback-core:1.2.3' 8 | 9 | testCompile 'junit:junit:4.12' 10 | } 11 | -------------------------------------------------------------------------------- /java/src/main/java/AngryProfessor.java: -------------------------------------------------------------------------------- 1 | import java.util.ArrayList; 2 | import java.util.List; 3 | import java.util.Scanner; 4 | 5 | /** 6 | * Created by gold on 2010. 01. 02.. 7 | */ 8 | public class AngryProfessor { 9 | 10 | public static void main(String[] args) { 11 | 12 | AngryProfessor ap = new AngryProfessor(); 13 | 14 | Scanner sc = new Scanner(System.in); 15 | 16 | int testCase = sc.nextInt(); 17 | 18 | for (int i = 0; i < testCase; i++) { 19 | int students = sc.nextInt(); 20 | int threshold = sc.nextInt(); 21 | List times = new ArrayList<>(); 22 | 23 | for (int j = 0; j < students; j++) 24 | times.add(sc.nextInt()); 25 | 26 | System.out.println(ap.solve(times, threshold) ? "YES" : "NO"); 27 | } 28 | 29 | } 30 | 31 | private boolean solve(final List times, final int threshold) { 32 | if (times.size() <= 0) 33 | return threshold > 0; 34 | 35 | int head = times.get(0); 36 | int tempThreshold = threshold; 37 | 38 | if (head > 0) 39 | tempThreshold--; 40 | 41 | return solve(new ArrayList(times){{remove(0);}}, tempThreshold); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /java/src/main/java/BirthdayChocolate.java: -------------------------------------------------------------------------------- 1 | import java.io.BufferedReader; 2 | import java.io.IOException; 3 | import java.io.InputStreamReader; 4 | import java.util.*; 5 | import java.util.stream.Collectors; 6 | 7 | /** 8 | * Created by yong on 2018. 11. 13.. 9 | */ 10 | public class BirthdayChocolate { 11 | public static void main(String[] args) throws IOException{ 12 | BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 13 | int N = Integer.parseInt(br.readLine()); 14 | 15 | String[] strs1 = br.readLine().trim().split(" "); 16 | int [] intArray = Arrays.stream(strs1).mapToInt(Integer::parseInt).toArray(); 17 | List list = Arrays.stream(intArray).boxed().collect(Collectors.toList()); 18 | 19 | String[] strs2 = br.readLine().trim().split(" "); 20 | int d = Integer.parseInt(strs2[0]); 21 | int m = Integer.parseInt(strs2[1]); 22 | System.out.println(solve(list, d, m , 0)); 23 | } 24 | 25 | public static int solve(List list, int d, int m, int acc){ 26 | 27 | if(list.size() < m) { 28 | return acc; 29 | } 30 | 31 | int sum = 0; 32 | for(int i = 0; i < m; i++){ 33 | sum += (int)list.get(i); 34 | } 35 | 36 | list.remove(0); 37 | if(sum == d) 38 | return solve(list, d, m, acc + 1); 39 | 40 | else 41 | return solve(list, d, m, acc); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /java/src/main/java/BirthdayChocolate_2.java: -------------------------------------------------------------------------------- 1 | import java.util.ArrayList; 2 | import java.util.Arrays; 3 | import java.util.List; 4 | import java.util.Scanner; 5 | import java.util.stream.Collectors; 6 | 7 | /** 8 | * Created by gold on 2018. 12. 7. 9 | */ 10 | public class BirthdayChocolate_2 { 11 | 12 | public static void main(String[] args) { 13 | 14 | BirthdayChocolate_2 bc = new BirthdayChocolate_2(); 15 | 16 | Scanner sc = new Scanner(System.in); 17 | 18 | int n = sc.nextInt(); 19 | 20 | int[] arr = new int[n]; 21 | 22 | for (int i = 0; i < n; i++) 23 | arr[i] = sc.nextInt(); 24 | 25 | int d = sc.nextInt(); 26 | 27 | int m = sc.nextInt(); 28 | 29 | // m 의 개수의 정수의 합으로 d 를 만들어라. 30 | 31 | System.out.println(bc.solve(Arrays.stream(arr).boxed().collect(Collectors.toList()), m, d, new ArrayList<>())); 32 | System.out.println(bc.solve(Arrays.stream(arr).boxed().collect(Collectors.toList()), m, d, new ArrayList<>()).size()); 33 | 34 | } 35 | 36 | private List> solve(List input, int m, int d, List> acc) { 37 | if (input.size() <= 0 || input.size() < m) 38 | return acc; 39 | 40 | int sum = 0; 41 | List temp = new ArrayList<>(); 42 | for (int i = 0; i < m; i++) { 43 | temp.add(input.get(i)); 44 | sum += input.get(i); 45 | } 46 | 47 | if (sum == d) 48 | acc.add(temp); 49 | 50 | input.remove(0); 51 | 52 | return solve(input, m, d, acc); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /java/src/main/java/BreakingTheRecords.java: -------------------------------------------------------------------------------- 1 | import java.util.Arrays; 2 | import java.util.Scanner; 3 | 4 | public class BreakingTheRecords { 5 | 6 | public static void main(String[] args) { 7 | Scanner sc = new Scanner(System.in); 8 | 9 | BreakingTheRecords btr = new BreakingTheRecords(); 10 | 11 | int count = sc.nextInt(); 12 | int[] arr = new int[count]; 13 | 14 | for (int i = 0; i < count; i++) 15 | arr[i] = sc.nextInt(); 16 | 17 | // System.out.println(btr.btrMaxRec(arr[0], arr, 0, 0)); 18 | // 19 | // System.out.println(btr.btrMinRec(arr[0], arr, 0, 0)); 20 | 21 | System.out.println(Arrays.toString(btr.btrMaxMin(arr, arr[0], arr[0], 0, new int[2]))); 22 | } 23 | 24 | //3 25 | private int[] btrMaxMin(final int[] arr, final int max, final int min, final int index, final int[] count) { 26 | if (index >= arr.length) 27 | return count; 28 | 29 | int tempMax = max; 30 | int tempMin = min; 31 | int tempIndex = index; 32 | int[] tempCount = count.clone(); 33 | 34 | if (arr[index] > max) { 35 | tempMax = arr[index]; 36 | tempCount[0] = count[0] + 1; 37 | } 38 | 39 | if (arr[index] < min) { 40 | tempMin = arr[index]; 41 | tempCount[1] = count[1] + 1; 42 | } 43 | 44 | return btrMaxMin(arr, tempMax, tempMin, ++tempIndex, tempCount); 45 | } 46 | 47 | 48 | //2 49 | private int btrMaxRec(int max, int[] arr, int count, int index) { 50 | if (index >= arr.length) 51 | return count; 52 | 53 | if (arr[index] > max) { 54 | return btrMaxRec(arr[index], arr, ++count, ++index); 55 | } else { 56 | return btrMaxRec(max, arr, count, ++index); 57 | } 58 | } 59 | 60 | private int btrMinRec(int min, int[] arr, int count, int index) { 61 | if (index >= arr.length) 62 | return count; 63 | 64 | if (arr[index] < min) { 65 | return btrMinRec(arr[index], arr, ++count, ++index); 66 | } else { 67 | return btrMinRec(min, arr, count, ++index); 68 | } 69 | } 70 | 71 | 72 | //1 73 | private int btrMax(int max, int[] arr, int count) { 74 | for (int i : arr) { 75 | if (i > max) { 76 | max = i; 77 | count++; 78 | } 79 | } 80 | 81 | return count; 82 | } 83 | 84 | private int btrMin(int min, int[] arr, int count) { 85 | for (int i : arr) { 86 | if (i < min) { 87 | min = i; 88 | count++; 89 | } 90 | } 91 | 92 | return count; 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /java/src/main/java/HelloWorld.java: -------------------------------------------------------------------------------- 1 | import java.util.Scanner; 2 | 3 | class HelloWorld { 4 | 5 | public static void main(String[] args) { 6 | Scanner sc = new Scanner(System.in); 7 | int cases = sc.nextInt(); 8 | 9 | for (int i = 0; i < cases; i++) { 10 | String name = sc.next(); 11 | System.out.println("Hello, " + name + "!"); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java/src/main/java/LilysHomework.java: -------------------------------------------------------------------------------- 1 | import java.util.Arrays; 2 | import java.util.List; 3 | import java.util.stream.Collectors; 4 | 5 | public class LilysHomework { 6 | public static void main(String[] args){ 7 | int[] test1 = {656085744,592976686,3037922,82266352,17574000,344340000,8406892,591292449,569625472,899357375,251327440,301303036,281400020,77370228,15516426,82859300,88364436,39767760,148417500,306863056,10926174,118195200,310408774,309307894,200852782,82193280,424056750,249277128,180368880,477624006,86748948,7434336,48882310,112635040,6614541,503907132,598034610,160500171,70444416,72752680,271416096,30521205,529365648,399367584,129849984,263500556,76737948,464269640,613416088,162724716,163420800,720512988,1217212920,727647624,383190420,8350904,3456024,289141064,123384024,158867856,82005504,36225521,533012608,54370440,17671500,53627000,26597644,855638940,55343960,57828624,108025344,21431808,1182600,265643950,30054300,219553915,74203500,658061160,7502400,931691763,295769136,107345925,80109000,130922055,33544944,65280,452996453,301655430,7828912,425016000,297635898,26861016,739961600,928116,19645470,8691456,5123880,596100015,2735436,25596483,173620720,202797504,161748972,30122300,11082820,574006860,426732182,71136825,105659136,1808140278,450779280,286831620,104683008,938781480,175050736,255681692,67096152,119518575,15449840,25273458,165048960,5642130,85199958,354920488,446786340,131214816,41533296,25766518,90782304,59007600,700369740,122021794,56982366,238027920,434370816,223677580,72463156,355858300,144914616,145950,13822570,19914930,11072100,21450528,124958730,105156800,20843784,781192188,448358850,6139822,95694780,78713888,677177472,9963972,366432768,181113408,725292862,473528052,12864000,518355540,55832070,318508876,89963781,1796290329,844308846,428627693,276255100,123609720,440449488,27589680,426614166,110068200,408846096,620309228,186565236,49051552,561738897,650114105,32646556,7174400,275364045,945364797,3674160,66314292,11073770,14885370,245088324,669628848,33110250,971699976,324099072,259496060,492110802,52206516,508725376,1534995792,148078816,57993375,121071195,381960195,12496176,23728250,159836835,712982980,160098622,909675852,110400300,485423372,30637838,339925836,285371600,13618242,80809650,92375040,265612788,1151909241,234661320,16962144,213417000,269646860,1015650090,117439476,53164566,6946134,89506800,305469360,13406432,292353000,9969642,43982198,23887296,67730660,16384192,218824704,1082660306,1679473908,136336179,39265884,1077096020,464272368,87048192,56752487,156212388,360621525,8472816,17613600,62143172,82696127,79939536,155805468,159499963,262072360,39827904,179532360,2455040,327280740,148409340,73738980,3394872,3082560,225009981,188912256,179487784,340340,315171072,96680664,621206280,536379504,391714074,65055960,105570465,365721408,106712025,286764660}; 8 | System.out.println(lilysHomework(test1)); 9 | } 10 | 11 | static int lilysHomework(int[] arr) { 12 | 13 | int ascCnt = ascCnt(Arrays.stream(arr).boxed().collect(Collectors.toList()), 0); 14 | int descCnt = descCnt(Arrays.stream(arr).boxed().collect(Collectors.toList()), 0); 15 | 16 | return ( ascCnt > descCnt ) ? descCnt : ascCnt; 17 | } 18 | 19 | static int ascCnt(List list, int cnt){ 20 | // 탈출 조건 21 | if(list.size() <= 0) return cnt; 22 | 23 | // 1. 가장 작은 값 추출 24 | int min = list.stream().reduce(list.get(0), (num1, num2) -> num1 < num2 ? num1 : num2 ); 25 | 26 | if(list.get(0) != min){ 27 | // 2. 가장 작은 값이 0번 째 값과 같지 않으면 최소값을 0으로 옮긴 후, 0번째 값 삭제 28 | int idx = list.indexOf(min); 29 | list.set(idx, list.get(0)); 30 | cnt++; 31 | } 32 | 33 | list.remove(0); 34 | 35 | return ascCnt(list, cnt); 36 | } 37 | 38 | static int descCnt(List list, int cnt){ 39 | // 탈출 조건 40 | if(list.size() <= 0) return cnt; 41 | 42 | // 1. 가장 큰 값 추출 43 | int max = list.stream().reduce(list.get(0), (num1, num2) -> num1 > num2 ? num1 : num2 ); 44 | 45 | if(list.get(0) != max){ 46 | // 2. 가장 큰 값이 0번 째 값과 같지 않으면 최대값을 0으로 옮긴 후, 0번째 값 삭제 47 | int idx = list.indexOf(max); 48 | list.set(idx, list.get(0)); 49 | cnt++; 50 | } 51 | 52 | list.remove(0); 53 | 54 | return descCnt(list, cnt); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /java/src/main/java/Lotto.java: -------------------------------------------------------------------------------- 1 | import java.util.*; 2 | import java.util.stream.Collectors; 3 | 4 | public class Lotto { 5 | 6 | private static List> results = new ArrayList<>(); 7 | 8 | public static void main(String[] args) { 9 | Scanner sc = new Scanner(System.in); 10 | String currentLine = sc.nextLine(); 11 | 12 | while (!currentLine.equals("0")) { 13 | printLotto(currentLine); 14 | currentLine = sc.nextLine(); 15 | System.out.println(); 16 | } 17 | } 18 | 19 | private static void printLotto(String currentLine) { 20 | List inputs = Arrays.stream(currentLine.split(" ")) 21 | .map(Integer::valueOf) 22 | .collect(Collectors.toList()); 23 | 24 | int k = inputs.get(0); 25 | List tailList = inputs.subList(1, inputs.size()); 26 | 27 | lotto(k, tailList); 28 | results.stream() 29 | .sorted(getLottoComparator()) 30 | .map(result -> result.stream().map(String::valueOf).collect(Collectors.joining(" "))) 31 | .distinct() 32 | .forEach(System.out::println); 33 | } 34 | 35 | private static void lotto(int k, List list) { 36 | if (list.size() == 6) { 37 | results.add(list); 38 | } else { 39 | for (int i = 0; i < k; i++) { 40 | List subList = new ArrayList<>(list); 41 | subList.remove(i); 42 | lotto(k - 1, subList); 43 | } 44 | } 45 | } 46 | 47 | private static Comparator> getLottoComparator() { 48 | return (s1, s2) -> { 49 | for (int i = 0; i < 6; i++) { 50 | if (s1.get(i) > s2.get(i)) { 51 | return 1; 52 | } else if (s1.get(i) < s2.get(i)) { 53 | return -1; 54 | } 55 | } 56 | 57 | return 0; 58 | }; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /java/src/main/java/Programmers.java: -------------------------------------------------------------------------------- 1 | import java.util.*; 2 | import java.util.stream.Collectors; 3 | import java.util.stream.IntStream; 4 | 5 | import static org.junit.Assert.assertArrayEquals; 6 | 7 | /** 8 | * Created by jeremy on 03/13/2019. 9 | */ 10 | public class Programmers { 11 | public static int[] solution(int[] progresses, int[] speeds) { 12 | List deploys = new ArrayList<>(); 13 | Queue works = IntStream.range(0, progresses.length).boxed().collect(Collectors.toCollection(LinkedList::new)); 14 | 15 | while (!works.isEmpty()) { 16 | int done = 0; 17 | // 1. check if work is done 18 | for (int i = 0; i < progresses.length; i++) { 19 | int progress = progresses[i]; 20 | if (works.element() == i && progress >= 100) { 21 | done++; 22 | works.remove(); 23 | } 24 | } 25 | if (done > 0) deploys.add(done); 26 | 27 | // 2. work 28 | for (int i = 0; i < progresses.length; i++) { 29 | if (progresses[i] < 100) { 30 | // print(progresses); 31 | progresses[i] += speeds[i]; 32 | } 33 | } 34 | } 35 | 36 | return deploys.stream().mapToInt(i -> i).toArray(); 37 | } 38 | 39 | public static void print(int[] progresses) { 40 | Arrays.stream(progresses).boxed().forEach(p -> System.out.print(p + " ")); 41 | System.out.println(); 42 | } 43 | 44 | public static void main(String[] args) { 45 | assertArrayEquals(new int [] { 2, 1 }, solution(new int [] { 93,30,55 }, new int[] { 1,30,5 })); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /javascript/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.moowork.node" version "1.2.0" 3 | } 4 | 5 | node { 6 | version = '6.11.0' 7 | distBaseUrl = 'https://nodejs.org/dist' 8 | download = true 9 | workDir = file("${project.buildDir}/nodejs") 10 | } 11 | 12 | task helloworld(type: NodeTask) { 13 | script = file('src/scripts/HelloWorld.js') 14 | args = ['arg1', 'arg2'] 15 | // options = ['--node-option', '--another-node-option'] 16 | } 17 | 18 | task afterParty(type: NodeTask) { 19 | // args = ['5 20', '99 101 1000 0 97'] 20 | script = file('src/scripts/AfterParty.js') 21 | } 22 | 23 | task digitalRoot(type: NodeTask) { 24 | script = file('src/scripts/DigitalRoot.js') 25 | } 26 | 27 | task SimpleBalancedParentheses(type: NodeTask) { 28 | script = file('src/scripts/SimpleBalancedParentheses.js') 29 | } 30 | 31 | task recordCounting(type: NodeTask) { 32 | script = file('src/scripts/RecordCounter.js') 33 | } -------------------------------------------------------------------------------- /javascript/src/scripts/AfterParty.js: -------------------------------------------------------------------------------- 1 | require('readline') 2 | .createInterface(process.stdin, process.stdout) 3 | .on('close', _ => { 4 | const input1 = '5 20'; 5 | const input2 = '99 101 1000 0 97'; 6 | 7 | const val = input1.split(' ').reduce((a, b) => a * b); 8 | const result = input2 9 | .split(' ') 10 | .map(v => val - v); 11 | 12 | console.log(); 13 | console.log(result.join(' ')); 14 | }); -------------------------------------------------------------------------------- /javascript/src/scripts/DigitalRoot.js: -------------------------------------------------------------------------------- 1 | const getDigitalRoot = val => { 2 | if (val.length === 1) { 3 | return +val; 4 | } 5 | 6 | return getDigitalRoot( 7 | val.split('') 8 | .reduce((a, b) => +a + +b) 9 | .toString() 10 | ); 11 | }; 12 | 13 | const getResult = (input, acc) => { 14 | const [head, ...tail] = input; 15 | switch (head) { 16 | case '0': 17 | return acc; 18 | default: 19 | acc.push(getDigitalRoot(head)); 20 | return getResult(tail, acc); 21 | } 22 | }; 23 | 24 | require('readline') 25 | .createInterface(process.stdin, process.stdout) 26 | .on('close', _ => { 27 | const input = `24\n39\n0`; 28 | const result = getResult(input.split('\n'), []); 29 | 30 | console.log(); 31 | console.log(result); 32 | }); -------------------------------------------------------------------------------- /javascript/src/scripts/HelloWorld.js: -------------------------------------------------------------------------------- 1 | const input = []; 2 | 3 | require('readline') 4 | .createInterface(process.stdin, process.stdout) 5 | .on('line', line => input.push(line.trim())) 6 | .on('close', _ => { 7 | for (let i = 0; i < input.length; i++) 8 | console.log('Hello, ' + input[i] + '!'); 9 | }); -------------------------------------------------------------------------------- /javascript/src/scripts/RecordCounter.js: -------------------------------------------------------------------------------- 1 | const counterV1 = (src, acc, result) => { 2 | if (src.length == 0) { 3 | return result; 4 | } else { 5 | var [score, ...remain] = src; 6 | if (acc == null) { 7 | acc = [score, score] 8 | } else if (acc[0] > score) { 9 | acc[0] = score; 10 | result[0]++; 11 | } else if (acc[1] < score) { 12 | acc[1] = score; 13 | result[1]++; 14 | } 15 | return counterV1(remain, acc, result); 16 | } 17 | }; 18 | 19 | const counterV2 = (src) => { 20 | var [minResult, maxResult] = src.reduce((acc, score) => { 21 | if (acc.length == 0) { 22 | return [0, 0, score, score]; 23 | } 24 | else { 25 | var [minCnt, maxCnt, min, max] = acc; 26 | return [score < min ? minCnt+1 : minCnt, 27 | score > max ? maxCnt+1 : maxCnt, 28 | Math.min(min, score), 29 | Math.max(max, score)]; 30 | } 31 | }, []); 32 | return [minResult, maxResult]; 33 | } 34 | 35 | 36 | require('readline') 37 | .createInterface(process.stdin, process.stdout) 38 | .on('close', _ => { 39 | const source = [10, 5, 20, 20, 4, 5, 2, 25, 1]; 40 | console.log('source : ' + source + '\nv1 final : ' + counterV1(source, null, [0, 0]) + '!'); 41 | console.log('\nsource : ' + source + '\nv2 final : ' + counterV2(source) + '!'); 42 | }); -------------------------------------------------------------------------------- /javascript/src/scripts/SimpleBalancedParentheses.js: -------------------------------------------------------------------------------- 1 | const isSimpleBalancedParentheses = _ => { 2 | const stack = []; 3 | const retFunc = { 4 | validate: val => { 5 | const [head, ...tail] = val; 6 | if (!head) { 7 | return stack.length === 0 ? true : false; 8 | } 9 | 10 | switch (head) { 11 | case '(': 12 | case '{': 13 | case '[': 14 | stack.push(head) 15 | return retFunc.validate(tail); 16 | case ')': 17 | if (stack[stack.length - 1] === '(') { 18 | stack.pop(); 19 | return retFunc.validate(tail); 20 | } 21 | return false; 22 | case '}': 23 | if (stack[stack.length - 1] === '{') { 24 | stack.pop(); 25 | return retFunc.validate(tail); 26 | } 27 | return false; 28 | case ']': 29 | if (stack[stack.length - 1] === '[') { 30 | stack.pop(); 31 | return retFunc.validate(tail); 32 | } 33 | return false; 34 | } 35 | } 36 | }; 37 | 38 | return retFunc; 39 | }; 40 | 41 | const getResult = (input, acc) => { 42 | const [head, ...tail] = input; 43 | switch (head) { 44 | case undefined: 45 | return acc; 46 | default: 47 | acc.push(isSimpleBalancedParentheses().validate(head.split(''))); 48 | return getResult(tail, acc); 49 | } 50 | }; 51 | 52 | require('readline') 53 | .createInterface(process.stdin, process.stdout) 54 | .on('close', _ => { 55 | const successInput = '(()()()())\n(((())))\n(()((())()))'; 56 | const failInput = '((((((())\n()))\n(()()(()\n(()))(\n())(()'; 57 | 58 | const successResult = getResult(successInput.split('\n'), []); 59 | const failResult = getResult(failInput.split('\n'), []); 60 | 61 | console.log(); 62 | console.log(`Success: ${successResult}`); 63 | console.log(`Fail: ${failResult}`); 64 | }); -------------------------------------------------------------------------------- /kotlin/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.31' 3 | 4 | repositories { 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 10 | } 11 | } 12 | 13 | apply plugin: 'kotlin' 14 | 15 | dependencies { 16 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" 17 | implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M1' 18 | 19 | testCompile "org.jetbrains.kotlin:kotlin-test" 20 | testCompile "org.jetbrains.kotlin:kotlin-test-junit" 21 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/AfterParty.kt: -------------------------------------------------------------------------------- 1 | import java.util.Scanner 2 | 3 | /** 4 | * Created by Lazysoul on 2017. 7. 18.. 5 | */ 6 | object AfterParty { 7 | 8 | @JvmStatic 9 | fun main(args: Array) { 10 | 11 | val sc = Scanner(System.`in`) 12 | 13 | val count = sc.nextLine() 14 | .split(" ") 15 | .map { it.toInt() } 16 | .reduce { acc, value -> acc * value } 17 | 18 | val result = sc.nextLine() 19 | .split(" ") 20 | .map { it.toInt() - count } 21 | 22 | require(result == listOf(-1, 1, 900, -100, -3)) 23 | } 24 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/Aircondition.kt: -------------------------------------------------------------------------------- 1 | object Aircondition { 2 | @JvmStatic 3 | fun main(args: Array) { 4 | require(solve(90, listOf(10, 10, 10, 10, 10, 10, 10, 10, 10))) 5 | require(solve(1000, listOf(77, 77, 70, 11, 34, 35, 41, 83, 54))) 6 | require(!solve(50, listOf(10, 20, 30, 40, 50, 60, 50, 40, 30))) 7 | } 8 | 9 | private tailrec fun solve(max: Int, buildings: List): Boolean = when { 10 | max < 0 -> false 11 | buildings.isEmpty() -> max >= 0 12 | else -> solve(max - buildings.first(), buildings.drop(1)) 13 | } 14 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/AngryTeacher.kt: -------------------------------------------------------------------------------- 1 | object AngryTeacher { 2 | 3 | @JvmStatic 4 | fun main(args: Array) { 5 | require(solve(3, arrayOf(-1, -3, 4, 2)) == "YES") 6 | require(solve(2, arrayOf(0, -1, 2, 1)) == "NO") 7 | require(solve(0, arrayOf()) == "NO") 8 | require(solve(4, arrayOf(-93, -86, 49, -62, -90, -63, 40, 72, 11, 67)) == "NO") 9 | require(solve(10, arrayOf(23, -35, -2, 58, -67, -56, -42, -73, -19, 37)) == "YES") 10 | require(solve(9, arrayOf(13, 91, 56, -62, 96, -5, -84, -36, -46, -13)) == "YES") 11 | require(solve(8, arrayOf(45, 67, 64, -50, -8, 78, 84, -51, 99, 60)) == "YES") 12 | } 13 | 14 | private tailrec fun solve(limit: Int, students: Array, acc: Int = 0): String = 15 | when { 16 | acc == 0 && students.isEmpty() -> "NO" 17 | students.isEmpty() -> if (limit > acc) "YES" else "NO" 18 | else -> { 19 | val head = students[0] 20 | solve(limit, students.sliceArray(1 until students.size), if (head > 0) acc + 1 else acc) 21 | } 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/BaseBall.kt: -------------------------------------------------------------------------------- 1 | fun main(args: Array) { 2 | 3 | require(solve(5, 5) == 4) 4 | require(solve(4, 5) == 5) 5 | require(solve(6, 4) == 0) 6 | } 7 | 8 | private tailrec fun solve(scoreA: Int, scoreB: Int, acc: Int = 0): Int = 9 | when { 10 | scoreA > scoreB -> acc 11 | scoreA <= scoreB && acc == 0 -> solve(scoreA + 1, scoreB, acc + 4) 12 | else -> solve(scoreA + 1, scoreB, acc + 1) 13 | } 14 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/DigitalRoot.kt: -------------------------------------------------------------------------------- 1 | import java.util.Scanner 2 | 3 | /** 4 | * Created by Lazysoul on 2017. 7. 18.. 5 | */ 6 | object DigitalRoot { 7 | 8 | @JvmStatic 9 | fun main(args: Array) { 10 | 11 | val sc = Scanner(System.`in`) 12 | val result = getResult(sc, listOf()) 13 | 14 | require(result == listOf(6, 3)) 15 | } 16 | 17 | tailrec fun getResult(sc: Scanner, acc: List): List { 18 | val value = sc.nextLine() 19 | return when (value) { 20 | "0" -> acc 21 | else -> getResult(sc, acc.plus(getDigitalRoot(value))) 22 | } 23 | } 24 | 25 | tailrec fun getDigitalRoot(value: String): Int { 26 | return if (value.length == 1) { 27 | value.toInt() 28 | } else { 29 | getDigitalRoot(value 30 | .map { it.toInt() - 48 } 31 | .reduce { x, y -> x + y } 32 | .toString()) 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/DrawRect.kt: -------------------------------------------------------------------------------- 1 | import java.util.* 2 | 3 | fun main(args: Array) { 4 | val sc = Scanner(System.`in`) 5 | val cases = sc.nextLine().toInt() 6 | 7 | for (i in 0 until cases) { 8 | val point1 = sc.nextLine().split(" ") 9 | val point2 = sc.nextLine().split(" ") 10 | val point3 = sc.nextLine().split(" ") 11 | 12 | // listOf(point1, point2, point3) 13 | val t1 = System.currentTimeMillis() 14 | val x1 = getResultViaGroupBy(listOf(point1[0], point2[0], point3[0])) 15 | val y1 = getResultViaGroupBy(listOf(point1[1], point2[1], point3[1])) 16 | println("$x1 $y1") 17 | println("groupBy : ${System.currentTimeMillis() - t1}") 18 | 19 | val t2 = System.currentTimeMillis() 20 | val x = getResultViaFold(listOf(point1[0], point2[0], point3[0])) 21 | val y = getResultViaFold(listOf(point1[1], point2[1], point3[1])) 22 | println("$x $y") 23 | println("fold : ${System.currentTimeMillis() - t2}") 24 | } 25 | } 26 | 27 | fun getResultViaGroupBy(list: List): String = 28 | list.groupBy { it } 29 | .filter { it.value.size == 1 } 30 | .map { it.key } 31 | .toString() 32 | 33 | 34 | fun getResultViaFold(list: List): String = 35 | list.fold(listOf(), { acc, value -> 36 | if (!acc.contains(value)) { 37 | acc.plus(value) 38 | } else { 39 | acc.minus(value) 40 | } 41 | }).first() 42 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/ElectronicSaveAircon.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * */ 4 | fun main(args: Array) { 5 | require(solve(90, listOf(10, 10, 10, 10, 10, 10, 10, 10, 10))) 6 | require(solve(1000, listOf(77, 77, 70, 11, 34, 35, 41, 83, 54))) 7 | require(!solve(50, listOf(10, 20, 30, 40, 50, 60, 50, 40, 30))) 8 | } 9 | 10 | private tailrec fun solve(total: Int, list: List): Boolean { 11 | return when (list.isEmpty()) { 12 | true -> total >= 0 13 | false -> { 14 | solve(total - list[0], list.drop(1)) 15 | } 16 | } 17 | // return total < list.sum() 18 | } 19 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/FindLargestSquare.kt: -------------------------------------------------------------------------------- 1 | object FindLargestSquare { 2 | 3 | @JvmStatic 4 | fun main(args: Array) { 5 | 6 | val board = listOf( 7 | listOf('X', 'O', 'O', 'O', 'X', 'O', 'O', 'O'), 8 | listOf('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'), 9 | listOf('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'), 10 | listOf('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'), 11 | listOf('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'), 12 | listOf('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'), 13 | listOf('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'), 14 | listOf('X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'), 15 | listOf('X', 'X', 'O', 'O', 'O', 'O', 'O', 'O'), 16 | listOf('X', 'X', 'O', 'O', 'O', 'O', 'O', 'O'), 17 | listOf('X', 'X', 'O', 'O', 'O', 'O', 'O', 'O'), 18 | listOf('X', 'X', 'O', 'O', 'O', 'O', 'O', 'O'), 19 | listOf('X', 'X', 'O', 'O', 'O', 'O', 'O', 'O'), 20 | listOf('X', 'X', 'O', 'O', 'O', 'O', 'O', 'O'), 21 | listOf('X', 'X', 'X', 'X', 'X', 'O', 'O', 'O')) 22 | 23 | val value = findLargestSquare(board, 0, 0, 0) 24 | val result = value * value 25 | 26 | println("result : $result") 27 | 28 | } 29 | 30 | private tailrec fun findLargestSquare(board: List>, x: Int, y: Int, max: Int): Int { 31 | val maxHeight = board.size 32 | val maxWidth = board.first().size 33 | return when { 34 | x == maxWidth - 1 && y == maxHeight - 1 -> max 35 | maxHeight - y <= max -> max 36 | maxWidth - x <= max -> findLargestSquare(board, 0, y + 1, max) 37 | else -> findLargestSquare(board, x + 1, y, 38 | maxOf(max, getMaxValue(board, x, y, 0))) 39 | } 40 | } 41 | 42 | private tailrec fun getMaxValue(board: List>, x: Int, y: Int, max: Int): Int { 43 | if (board.size <= y + max || board.first().size <= x + max) { 44 | return max 45 | } 46 | for (i in y..y + max) { 47 | (x..x + max) 48 | .filter { board[i][it] == 'X' } 49 | .forEach { return max } 50 | } 51 | return getMaxValue(board, x, y, max + 1) 52 | } 53 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/HelloWorld.kt: -------------------------------------------------------------------------------- 1 | import java.util.Scanner 2 | 3 | fun main(args: Array) { 4 | val sc = Scanner(System.`in`) 5 | val cases = sc.nextInt() 6 | 7 | for (i in 0..cases - 1) { 8 | val name = sc.next() 9 | println("Hello, $name!") 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/LengthOfLongestSubstring.kt: -------------------------------------------------------------------------------- 1 | import kotlin.system.measureTimeMillis 2 | 3 | 4 | fun main(args: Array) { 5 | 6 | // require( 7 | // "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#\$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#\$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ " 8 | // .substring(0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#\$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ ".length) == "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#\$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ " 9 | // ) 10 | 11 | require(lengthOfLongestSubstring("abcabcbb") == 3) //abc 12 | require(lengthOfLongestSubstring("bbbbb") == 1) //b 13 | require(lengthOfLongestSubstring("pwwkew") == 3) //wke 14 | require(lengthOfLongestSubstring("dvdf") == 3) //vdf 15 | require(lengthOfLongestSubstring("dtdztwhepnkguuuowsxztrmivgdyiw") == 14) //uowsxztrmivgdy 16 | require(lengthOfLongestSubstring("hkcpmprxxxqw") == 5) //hkcpm 17 | 18 | 19 | // measureTimeMillis { 20 | // println(lengthOfLongestSubstring("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCD")) 21 | // }.also { println(it) } 22 | 23 | } 24 | 25 | fun lengthOfLongestSubstring(s: String): Int { 26 | 27 | // val input = s.toList().map { it.toString() } 28 | // return solveHelper1(input, input, listOf(), mapOf()) 29 | 30 | val input = s.toList().map { it.toString() }.toTypedArray() 31 | return solveHelper2(s, input, input, arrayOf(), mapOf()) 32 | } 33 | 34 | private tailrec fun solveHelper2( 35 | originStr: String, 36 | origin: Array, 37 | l: Array, 38 | acc: Array, 39 | store: Map 40 | ): Int = when { 41 | origin.isEmpty() || l.isEmpty() -> { 42 | val tempStore = store.plus(acc.joinToString("") to acc.size) 43 | tempStore.values.max() ?: 0 44 | } 45 | acc.isEmpty() -> solveHelper2(originStr, origin, l.sliceArray(1 until l.size), acc + l.first(), store) 46 | else -> { 47 | val head = l.first() 48 | if (!acc.contains(head)) { 49 | solveHelper2(originStr, origin, l.sliceArray(1 until l.size), acc + head, store) 50 | } else { 51 | val key = acc.joinToString("") 52 | if (store.containsKey(key)) { 53 | val distincted = distinct(originStr, key, origin) 54 | val distinctStr = distincted.first 55 | val distinctArray = distincted.second 56 | 57 | solveHelper2(distinctStr, distinctArray, distinctArray, arrayOf(), store) 58 | } else { 59 | val tempStore = store.plus(acc.joinToString("") to acc.size) 60 | solveHelper2(originStr, origin.sliceArray(1 until origin.size), origin.sliceArray(1 until origin.size), arrayOf(), tempStore) 61 | } 62 | } 63 | } 64 | } 65 | 66 | private fun distinct(originStr: String, key: String, l: Array): Pair> { 67 | 68 | var originCopy = originStr 69 | 70 | while (originCopy.startsWith(key)) { 71 | originCopy = originCopy.substring(key.length, originCopy.length) 72 | } 73 | 74 | val a = if (originCopy.length != originStr.length) 75 | key.last() + originCopy 76 | else 77 | originCopy 78 | 79 | return originCopy to a.toList().map { it.toString() }.toTypedArray() 80 | } 81 | 82 | 83 | 84 | 85 | private fun solveHelper(origin: List, l: List, acc: List, store: HashMap): Int { 86 | 87 | if (origin.isEmpty() || l.isEmpty()) { 88 | store[acc.joinToString("")] = acc.size 89 | return store.values.max() ?: 0 90 | } 91 | 92 | if (acc.isEmpty()) { 93 | return solveHelper(origin, l.drop(1), acc + l.first(), store) 94 | } 95 | 96 | val head = l.first() 97 | 98 | if (!acc.contains(head)) { 99 | return solveHelper(origin, l.drop(1), acc + head, store) 100 | } else { 101 | store[acc.joinToString("")] = acc.size 102 | return solveHelper(origin.drop(1), origin.drop(1), listOf(), store) 103 | } 104 | 105 | } 106 | 107 | private tailrec fun solveHelper1( 108 | origin: List, 109 | l: List, 110 | acc: List, 111 | store: Map 112 | ): Int = when { 113 | origin.isEmpty() || l.isEmpty() -> { 114 | val tempStore = store.plus(acc.joinToString("") to acc.size) 115 | tempStore.values.max() ?: 0 116 | } 117 | acc.isEmpty() -> solveHelper1(origin, l.drop(1), acc + l.first(), store) 118 | else -> { 119 | val head = l.first() 120 | if (!acc.contains(head)) { 121 | solveHelper1(origin, l.drop(1), acc + head, store) 122 | } else { 123 | val tempStore = store.plus(acc.joinToString("") to acc.size) 124 | solveHelper1(origin.drop(1), origin.drop(1), listOf(), tempStore) 125 | } 126 | } 127 | } 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/LilyHomework.kt: -------------------------------------------------------------------------------- 1 | import java.util.* 2 | 3 | fun main(args: Array) { 4 | require(lilysHomework(arrayOf(3, 5, 2, 6, 1)) == 2) 5 | require(lilysHomework(arrayOf(3, 2, 1)) == 0) 6 | } 7 | 8 | 9 | fun lilysHomework(arr: Array): Int { 10 | val startSize = arr.size 11 | 12 | val asc = asc(Arrays.copyOf(arr, startSize), startSize) 13 | val desc = desc(Arrays.copyOf(arr, startSize), startSize) 14 | return if (asc < desc) asc else desc 15 | } 16 | 17 | 18 | tailrec fun asc(arrays: Array, startSize: Int, acc: Int = 0): Int { 19 | return when (arrays.size) { 20 | 0 -> acc 21 | else -> { 22 | val firstValue = arrays[0] 23 | val position = getMinValuePosition(arrays.toList(), 0, firstValue, 0) 24 | 25 | arrays[0] = arrays[position] 26 | arrays[position] = firstValue 27 | 28 | val arrayCopy = arrays.sliceArray(1 until startSize) 29 | asc(arrayCopy, startSize - 1, acc + if (position == 0) 0 else 1) 30 | } 31 | } 32 | } 33 | 34 | tailrec fun desc(arrays: Array, startSize: Int, acc: Int = 0): Int { 35 | return when (arrays.size) { 36 | 0 -> acc 37 | else -> { 38 | val firstValue = arrays[0] 39 | val position = getMaxValuePosition(arrays.toList(), 0, firstValue, 0) 40 | 41 | arrays[0] = arrays[position] 42 | arrays[position] = firstValue 43 | 44 | val arrayCopy = arrays.sliceArray(1 until startSize) 45 | desc(arrayCopy, startSize - 1, acc + if (position == 0) 0 else 1) 46 | } 47 | } 48 | } 49 | 50 | tailrec fun getMinValuePosition( 51 | list: List, 52 | position: Int, 53 | min: Int, 54 | currentPosition: Int 55 | ): Int = when (list.isEmpty()) { 56 | true -> position 57 | false -> { 58 | val firstValue = list[0] 59 | getMinValuePosition( 60 | list.drop(1), 61 | if (min < firstValue) position else currentPosition, 62 | if (min < firstValue) min else firstValue, 63 | currentPosition + 1) 64 | } 65 | } 66 | 67 | tailrec fun getMaxValuePosition(list: List, position: Int, max: Int, currentPosition: Int): Int = 68 | when (list.isEmpty()) { 69 | true -> position 70 | false -> { 71 | val firstValueInList = list[0] 72 | getMaxValuePosition( 73 | list.drop(1), 74 | if (max > firstValueInList) position else currentPosition, 75 | if (max > firstValueInList) max else firstValueInList, 76 | currentPosition + 1 77 | ) 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/LongestSubstring.kt: -------------------------------------------------------------------------------- 1 | 2 | import kotlin.system.measureTimeMillis 3 | /*Example 1: 4 | Input: "abcabcbb" 5 | Output: 3 6 | Explanation: The answer is "abc", with the length of 3. 7 | Example 2: 8 | Input: "bbbbb" 9 | Output: 1 10 | Explanation: The answer is "b", with the length of 1. 11 | Example 3: 12 | Input: "pwwkew" 13 | Output: 3 14 | Explanation: The answer is "wke", with the length of 3. 15 | Note that the answer must be a substring, "pwke" is a subsequence and not a substring.*/ 16 | class Solution2 { 17 | fun lengthOfLongestSubstring(s: String): Int = if (s.length <= 1) s.length else recursive(s).length 18 | private tailrec fun recursive( 19 | s: String, 20 | acc: String = "" 21 | ): String = when { 22 | s.isEmpty() -> acc 23 | else -> { 24 | val tail = s.drop(1) 25 | val recursiveAcc = recursive2(s) 26 | val greaterThan = acc.length > recursiveAcc.length 27 | val result = if (greaterThan) acc else recursiveAcc 28 | recursive( 29 | tail, 30 | result 31 | ) 32 | } 33 | } 34 | private tailrec fun recursive2( 35 | s: String, 36 | acc: String = "" 37 | ): String = when { 38 | s.isEmpty() -> acc 39 | else -> { 40 | val head = s[0] 41 | val tail = s.drop(1) 42 | when { 43 | acc.contains(head) -> acc 44 | else -> recursive2(tail, acc + head) 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/LongestSubstringFromChanHo.kt: -------------------------------------------------------------------------------- 1 | import kotlin.math.max 2 | 3 | fun main(args: Array) { 4 | val problems = listOf("abcabcbb", "bbbbb", "pwwkew", "", "dvdf", "asjrgapa") 5 | val expected = listOf(3, 1, 3, 0, 3, 6) 6 | 7 | problems.mapIndexed { index, s -> Pair(solution(s), expected.get(index)) } 8 | .forEach { (result, expected) -> 9 | println("result = $result, expected = $expected") 10 | assert(result == expected) 11 | } 12 | 13 | } 14 | 15 | fun solution(str: String): Int { 16 | return maxLength(substring(str)) 17 | } 18 | 19 | fun substring(str: String): List { 20 | return if (str.isEmpty()) 21 | listOf() 22 | else { 23 | str.fold(mutableListOf()) { acc, ch -> 24 | if (acc.size == 0) { 25 | acc.add("$ch") 26 | } else { 27 | val tmp = acc[acc.size - 1] 28 | if (tmp.contains("$ch")) { 29 | acc.add("${tmp.drop(tmp.lastIndexOf(ch) + 1)}$ch") 30 | } else { 31 | acc[acc.size - 1] = "$tmp$ch" 32 | } 33 | } 34 | acc 35 | } 36 | } 37 | } 38 | 39 | fun maxLength(strs: List): Int { 40 | return strs.map { 41 | it.length 42 | }.takeIf { 43 | it.size >= 2 44 | }?.reduce { acc, i -> 45 | max(acc, i) 46 | }?: run { 47 | if (strs.isEmpty()) 0 48 | else strs[0].length 49 | } 50 | } 51 | 52 | 53 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/Lotto.kt: -------------------------------------------------------------------------------- 1 | import java.lang.Integer.parseInt 2 | import java.util.Scanner 3 | 4 | val MAX = 6 5 | 6 | fun main(args: Array) { 7 | val sc = Scanner(System.`in`) 8 | 9 | while (sc.hasNext()) { 10 | val line = sc.nextLine() 11 | if (line.trim().length == 1) { 12 | if (parseInt(line) == 0) { 13 | return 14 | } 15 | } else { 16 | val splits = line.split(" ") 17 | val size = parseInt(splits.first()) 18 | val labels = splits.takeLast(size).map{it.toInt()} 19 | 20 | printOut(getResult(labels, 0, MAX - 1, listOf())) 21 | } 22 | } 23 | 24 | 25 | 26 | 27 | } 28 | 29 | 30 | fun getResult(list: List, sIndx:Int, cIndex:Int, acc: List) : List = when { 31 | sIndx + MAX < list.size -> acc 32 | cIndex >= list.size -> getResult(list, sIndx+1, MAX, acc.plus(list.take(MAX-1).plus(listOf(list[cIndex])))) 33 | cIndex < list.size -> getResult(list, sIndx, cIndex+1, acc.plus(list.take(MAX-1).plus(listOf(list[cIndex])))) 34 | else -> acc 35 | } 36 | 37 | 38 | 39 | fun printOut(result: List) { 40 | println(result.joinToString(separator = " ")) 41 | 42 | } 43 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/Maraton.kt: -------------------------------------------------------------------------------- 1 | import kotlinx.coroutines.Dispatchers 2 | import kotlinx.coroutines.launch 3 | import kotlinx.coroutines.runBlocking 4 | import kotlin.system.measureTimeMillis 5 | 6 | object Maraton { 7 | tailrec fun solve(participant: List, completion: List, solution: String): String = 8 | when { 9 | solution.isNotEmpty() -> solution 10 | completion.isEmpty() -> participant.last() 11 | else -> { 12 | val part = participant[0] 13 | val compl = completion[0] 14 | 15 | if (part != compl) { 16 | solve(emptyList(), emptyList(), part) 17 | } else { 18 | solve(participant.drop(1), completion.drop(1), "") 19 | } 20 | 21 | } 22 | } 23 | 24 | 25 | tailrec fun solve1(participant: List, completion: List): List = when { 26 | completion.isEmpty() -> participant 27 | else -> { 28 | val head = completion.first() 29 | val temp1 = participant.takeWhile { it != head } 30 | val temp2 = participant.takeLast(participant.size - temp1.size - 1) 31 | solve1(temp1 + temp2, completion.drop(1)) 32 | } 33 | } 34 | } 35 | 36 | fun main() = runBlocking { 37 | val participant1 = arrayOf("leo", "kiki", "eden") 38 | val completion1 = arrayOf("eden", "kiki") 39 | 40 | val participant2 = arrayOf("marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa", "marina", "josipa", "nikola", "vinko", "filipa") 41 | val completion2 = arrayOf("josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko", "josipa", "filipa", "marina", "nikola", "vinko") 42 | 43 | val participant3 = arrayOf("mislav", "stanko", "mislav", "ana") 44 | val completion3 = arrayOf("stanko", "ana", "mislav") 45 | 46 | var array = emptyArray() 47 | var array2 = emptyArray() 48 | 49 | val job1 = launch { 50 | (1..100).forEach { 51 | array = array.plus(participant2) 52 | } 53 | } 54 | 55 | val job2 = launch { 56 | (1..100).forEach { 57 | array2 = array2.plus(completion2) 58 | } 59 | } 60 | 61 | job1.join() 62 | job2.join() 63 | 64 | val part = array.sorted() 65 | val compl = array2.dropLast(1).sorted() 66 | 67 | println("job1, job2 complete ${part.size} : ${compl.size}") 68 | 69 | 70 | val p = part.asSequence() 71 | val c = compl.asSequence() 72 | 73 | launch { 74 | measureTimeMillis { 75 | p.zip(c).filter { it.first != it.second } 76 | .toList() 77 | .also { println("hey : ${if (it.isEmpty()) p.last() else it}") } 78 | }.also { println(it) } 79 | } 80 | 81 | val time1 = launch(Dispatchers.Default) { 82 | measureTimeMillis { 83 | Maraton.solve(part, compl, "") 84 | .also { println(it) } 85 | }.also { println("time1 : $it") } 86 | } 87 | 88 | 89 | val time2 = launch(Dispatchers.Default) { 90 | measureTimeMillis { 91 | Maraton.solve1(part, compl).also { println(it) } 92 | }.also { println("time2 : $it") } 93 | } 94 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/PriyankaAndToys.kt: -------------------------------------------------------------------------------- 1 | import java.util.Scanner 2 | 3 | object PriyankaAndToys { 4 | 5 | @JvmStatic 6 | fun main(args: Array) { 7 | 8 | val sc = Scanner(System.`in`) 9 | sc.nextLine() 10 | 11 | // val nums: ArrayList = arrayListOf() 12 | // 13 | // for (i in 0 until cases) { 14 | // nums.add(sc.nextInt()) 15 | // } 16 | // nums.sort() 17 | 18 | val inputLine = sc.nextLine() 19 | val nums = inputLine 20 | .split(" ") 21 | .map { it.toInt() } 22 | .toList() 23 | .sorted() 24 | 25 | println(getResult(nums, 0)) 26 | } 27 | 28 | fun getResult(nums: List, acc: Int): Int = when { 29 | nums.isEmpty() -> acc 30 | else -> { 31 | val max = nums 32 | .mapIndexed { 33 | index, _ -> 34 | index to convert(nums.subList(index, nums.size)) 35 | } 36 | .maxBy { it.second } 37 | 38 | val subList = nums.subList(max!!.first, max.first + max.second) 39 | 40 | getResult(nums.minus(subList), acc + 1) 41 | } 42 | } 43 | 44 | fun convert(nums: List): Int { 45 | return nums 46 | .takeWhile { it <= nums[0] + 4 } 47 | .count() 48 | } 49 | 50 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/Programmers.kt: -------------------------------------------------------------------------------- 1 | fun main(args: Array) { 2 | 3 | require(solve(intArrayOf(93, 30, 55), intArrayOf(1, 30, 5)).contentEquals(intArrayOf(2, 1))) 4 | 5 | require(solve(intArrayOf(40, 93, 30, 55, 60, 65), intArrayOf(60, 1, 30, 5, 10, 7)).contentEquals(intArrayOf(1, 2, 3))) 6 | 7 | require(solve(intArrayOf(93, 30, 55, 60, 40, 65), intArrayOf(1, 30, 5, 10, 60, 7)).contentEquals(intArrayOf(2, 4))) 8 | 9 | require( 10 | solve( 11 | intArrayOf(15, 1, 14, 9, 29, 25, 17, 24, 4, 27, 7, 19, 29, 14, 23, 4, 21, 3, 8, 14), 12 | intArrayOf(9, 11, 21, 16, 11, 21, 7, 5, 6, 30, 11, 24, 26, 18, 20, 18, 15, 30, 7, 18) 13 | ).contentEquals(intArrayOf(6, 1, 13)) 14 | ) 15 | } 16 | 17 | 18 | /* 19 | 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 20 | 21 | 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 22 | 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 23 | 24 | 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses 와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 25 | 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 26 | */ 27 | tailrec fun solve(prog: IntArray, spd: IntArray, acc: IntArray = intArrayOf()): IntArray = when { 28 | prog.isEmpty() -> acc.reversed().toIntArray() 29 | prog.first() >= 100 -> { 30 | val temp = prog.takeWhile { it >= 100 } 31 | val size = temp.size 32 | solve(prog.drop(size).toIntArray(), spd.drop(size).toIntArray(), intArrayOf(size).plus(acc)) 33 | } 34 | else -> { 35 | val temp = zipping(prog, spd) 36 | solve(temp, spd, acc) 37 | } 38 | } 39 | 40 | fun zipping(prog: IntArray, spd: IntArray): IntArray { 41 | return prog.zip(spd) { p, s -> p + s }.toIntArray() 42 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/RefreshRecord.kt: -------------------------------------------------------------------------------- 1 | fun main(args: Array) { 2 | solve(listOf(10, 5, 20, 20, 4, 5, 2, 25, 1), 9) 3 | solve2(listOf(10, 5, 20, 20, 4, 5, 2, 25, 1)) 4 | solve3(listOf(10, 5, 20, 20, 4, 5, 2, 25, 1)) 5 | solve3(listOf(3, 4, 21, 36, 10, 28, 35, 5, 24, 42)) 6 | } 7 | 8 | data class RecordedScore(val minScore: Int = 0, val maxScore: Int = 0, val min: Int = 0, val max: Int = 0) 9 | 10 | tailrec fun solve( 11 | scoreList: List, 12 | size: Int, 13 | minScore: Int = 0, 14 | maxScore: Int = 0, 15 | min: Int = 0, 16 | max: Int = 0 17 | ) { 18 | when { 19 | scoreList.isEmpty() -> println("$max $min") 20 | scoreList.size == size -> { 21 | val score = scoreList.first() 22 | solve(scoreList.drop(1), 9, score, score) 23 | } 24 | scoreList.size != size -> { 25 | val score = scoreList.first() 26 | solve( 27 | scoreList.drop(1), 28 | size, 29 | if (score < minScore) score else minScore, 30 | if (score > maxScore) score else maxScore, 31 | if (score < minScore) min + 1 else min, 32 | if (score > maxScore) max + 1 else max 33 | ) 34 | } 35 | } 36 | } 37 | 38 | private tailrec fun solve2( 39 | scoreList: List, 40 | minScore: Int, 41 | maxScore: Int, 42 | min: Int = 0, 43 | max: Int = 0 44 | ) { 45 | when (scoreList.isEmpty()) { 46 | true -> println("$max $min") 47 | false -> { 48 | val score = scoreList.first() 49 | val scoreLessThenMinScore = score < minScore 50 | val scoreGreaterThenMinScore = score > maxScore 51 | solve2( 52 | scoreList.drop(1), 53 | if (scoreLessThenMinScore) score else minScore, 54 | if (scoreGreaterThenMinScore) score else maxScore, 55 | if (scoreLessThenMinScore) min + 1 else min, 56 | if (scoreGreaterThenMinScore) max + 1 else max 57 | ) 58 | } 59 | } 60 | } 61 | 62 | fun solve2(scoreList: List) { 63 | val init = scoreList.first() 64 | solve2(scoreList.drop(1), init, init) 65 | } 66 | 67 | fun solve3(scoreList: List) = scoreList.foldIndexed(RecordedScore()) { i, record, score -> 68 | when (i) { 69 | 0 -> RecordedScore(score, score) 70 | else -> RecordedScore( 71 | Math.min(score, record.minScore), 72 | Math.max(score, record.maxScore), 73 | if (score < record.minScore) record.min + 1 else record.min, 74 | if (score > record.maxScore) record.max + 1 else record.max 75 | ) 76 | } 77 | }.also { println("${it.max} ${it.min}") } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/Saddlepoint.kt: -------------------------------------------------------------------------------- 1 | fun main(args: Array) { 2 | val test1 = listOf( 3 | listOf(9, 8, 7), 4 | listOf(5, 3, 2), 5 | listOf(6, 6, 7)) 6 | 7 | val test2 = listOf( 8 | listOf(1, 2, 3), 9 | listOf(3, 1, 2), 10 | listOf(2, 3, 1)) 11 | val test3 = listOf( 12 | listOf(4, 5, 4), 13 | listOf(3, 5, 5), 14 | listOf(1, 5, 4)) 15 | 16 | val test4 = listOf( 17 | listOf(8, 7, 9), 18 | listOf(6, 7, 6), 19 | listOf(3, 2, 5) 20 | ) 21 | 22 | println(solve(test1).filterNotNull()) 23 | println(solve(test2).filterNotNull()) 24 | println(solve(test3).filterNotNull()) 25 | println(solve(test4).filterNotNull()) 26 | } 27 | 28 | private fun solve(list: List>): List?> { 29 | val xResult = list.map { it.max()!! }.min() 30 | val yResult = transfer(list, listOf()).map { it.min()!! }.max() 31 | 32 | return if (xResult == yResult) { 33 | list.foldIndexed(listOf()) { index, acc, lista -> 34 | acc.plus(lista.mapIndexed { indexa, i -> if(i == xResult) index to indexa else null }) 35 | } 36 | } else { 37 | listOf() 38 | } 39 | } 40 | 41 | tailrec fun transfer(list: List>, acc: List>): List> { 42 | return when { 43 | list.isEmpty() || list.first().isEmpty() -> acc 44 | else -> { 45 | transfer(list.map { it.drop(1) }, acc.plusElement(list.map { it.first() })) 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/SimpleBalancedParentheses.kt: -------------------------------------------------------------------------------- 1 | object SimpleBalancedParentheses { 2 | @JvmStatic 3 | fun main(args: Array) { 4 | val positive1 = "(()()()())" 5 | val positive2 = "(((())))" 6 | val positive3 = "(()((())()))" 7 | 8 | val negative1 = "((((((())" 9 | val negative2 = "()))" 10 | val negative3 = "(()()(()" 11 | 12 | val bonus1 = "(5+6)∗(7+8)/(4+3)" 13 | 14 | require(solve(positive1.toList(), listOf())) 15 | require(solve(positive2.toList(), listOf())) 16 | require(solve(positive3.toList(), listOf())) 17 | 18 | require(!solve(negative1.toList(), listOf())) 19 | require(!solve(negative2.toList(), listOf())) 20 | require(!solve(negative3.toList(), listOf())) 21 | 22 | require(solve(bonus1.toList(), listOf())) 23 | } 24 | 25 | private fun solve(list: List, acc: List): Boolean = when { 26 | list.isEmpty() -> acc.isEmpty() 27 | list.first() == ')' && acc.isEmpty() -> false 28 | list.first() == '(' -> solve(list.drop(1), acc.plus(list.first())) 29 | list.first() == ')' -> solve(list.drop(1), acc.dropLast(1)) 30 | else -> solve(list.drop(1), acc) 31 | } 32 | } -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/StreetRgb.kt: -------------------------------------------------------------------------------- 1 | fun main(args: Array) { 2 | val list: List> = listOf(listOf(26, 40, 83), listOf(49, 60, 57), listOf(13, 89, 99)) 3 | val list2: List> = listOf(listOf(1, 20, 30), listOf(50, 5, 6), listOf(9, 3, 7)) 4 | 5 | println(solve(list)) 6 | println(solve(list2)) 7 | 8 | } 9 | 10 | fun solve(list: List>, index: Int = 0, min: Int = 0): Int = when { 11 | list.isEmpty() || index == 3 -> min 12 | else -> solve(list, index + 1, findMin(list, index, 0, min)) 13 | } 14 | 15 | fun findMin(list: List>, index: Int, result: Int = 0, min: Int): Int = when { 16 | list.isEmpty() -> { 17 | if (min == 0) 18 | result 19 | else { 20 | if (min > result) { 21 | result 22 | } else { 23 | min 24 | } 25 | } 26 | } 27 | else -> { 28 | when (index) { 29 | 0 -> Math.min(//RED 30 | findMin(list.drop(1), 1, result + list.first()[index], min), 31 | findMin(list.drop(1), 2, result + list.first()[index], min)) 32 | 1 -> Math.min(//Green 33 | findMin(list.drop(1), 0, result + list.first()[index], min), 34 | findMin(list.drop(1), 2, result + list.first()[index], min)) 35 | 2 -> Math.min(//Blue 36 | findMin(list.drop(1), 0, result + list.first()[index], min), 37 | findMin(list.drop(1), 1, result + list.first()[index], min)) 38 | else -> { 39 | result 40 | } 41 | } 42 | } 43 | } 44 | 45 | /* 46 | 예제 입력 47 | 3 48 | 26 40 83 49 | 49 60 57 50 | 13 89 99 51 | 52 | 3 53 | 1 20 30 54 | 50 5 6 55 | 9 3 7 56 | 57 | 예제 출력 58 | 96 59 | 60 | 10 61 | */ 62 | 63 | -------------------------------------------------------------------------------- /kotlin/src/main/kotlin/SugarDelivery.kt: -------------------------------------------------------------------------------- 1 | object SugarDelivery { 2 | @JvmStatic 3 | fun main(args: Array) { 4 | require(solve(18) == 4, { "error" }) 5 | require(solve(4) == -1, { "error" }) 6 | require(solve(6) == 2, { "error" }) 7 | require(solve(9) == 3, { "error" }) 8 | require(solve(11) == 3, { "error" }) 9 | require(solve(5000) == 1000, { "error" }) 10 | } 11 | 12 | private fun solve(number: Int): Int = recursive(number, number / 5) 13 | 14 | private tailrec fun recursive(number: Int, fiveModResult: Int): Int = when { 15 | number % 5 == 0 -> fiveModResult 16 | fiveModResult >= 0 -> if ((number - (fiveModResult * 5)) % 3 == 0) { 17 | fiveModResult + (number - (fiveModResult * 5)) / 3 18 | } else { 19 | recursive(number, fiveModResult - 1) 20 | } 21 | else -> -1 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /scala/.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | *.log 3 | *.sc 4 | 5 | # exercism.io 6 | .keep 7 | 8 | # sbt specific 9 | dist/* 10 | target/ 11 | lib_managed/ 12 | src_managed/ 13 | project/boot/ 14 | project/target/ 15 | project/plugins/project/ 16 | 17 | # scala-ide specific 18 | .scala_dependencies 19 | 20 | # intellij 21 | .settings/ 22 | .idea/ 23 | *.iml 24 | *.iws 25 | 26 | # osx 27 | .DS_Store 28 | 29 | # svn 30 | .svn/ 31 | .metadata/ 32 | 33 | # nodejs 34 | node_modules/ 35 | 36 | -------------------------------------------------------------------------------- /scala/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | apply plugin: 'scala' 3 | 4 | dependencies { 5 | compile 'org.scala-lang:scala-library:2.11.1' 6 | } -------------------------------------------------------------------------------- /scala/build.sbt: -------------------------------------------------------------------------------- 1 | name := "funfunstudy-algorithm" 2 | 3 | version := "0.1" 4 | 5 | scalaVersion := "2.12.4" 6 | 7 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test" -------------------------------------------------------------------------------- /scala/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.0.3 2 | -------------------------------------------------------------------------------- /scala/src/main/scala/HelloWorld.scala: -------------------------------------------------------------------------------- 1 | import java.util.Scanner 2 | 3 | object HelloWorld { 4 | def main(args: Array[String]): Unit = { 5 | val sc = new Scanner(System.in) 6 | val cases = sc.nextInt 7 | 8 | for (_ <- 0 until cases) { 9 | val name = sc.next() 10 | println(s"Hello, $name!") 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /scala/src/main/scala/RGBDistance.scala: -------------------------------------------------------------------------------- 1 | object Color extends Enumeration { 2 | val RED = Value(0) 3 | val GREEN = Value(1) 4 | val BLUE = Value(2) 5 | } 6 | 7 | object RGBDistance { 8 | def recursive(count: Int, color: Color.Value, arr: List[List[Int]]): Int = { 9 | if (arr.size - 1 == count) return arr(count)(color.id) 10 | 11 | val current = arr(count)(color.id) 12 | color match { 13 | case Color.RED => 14 | val green = recursive(count + 1, Color.GREEN, arr) 15 | val blue = recursive(count + 1, Color.BLUE, arr) 16 | current + Math.min(green, blue) 17 | case Color.GREEN => 18 | val red = recursive(count + 1, Color.RED, arr) 19 | val blue = recursive(count + 1, Color.BLUE, arr) 20 | current + Math.min(red, blue) 21 | case Color.BLUE => 22 | val red = recursive(count + 1, Color.RED, arr) 23 | val green = recursive(count + 1, Color.GREEN, arr) 24 | current + Math.min(red, green) 25 | } 26 | } 27 | 28 | def main(args: Array[String]): Unit = { 29 | val arr: List[List[Int]] = List(List(26, 40, 83), List(49, 60, 57), List(13, 89, 99)) 30 | val arr2: List[List[Int]] = List(List(1, 20, 30), List(50, 5, 6), List(9, 3, 7)) 31 | 32 | val result = Math.min(recursive(0, Color.RED, arr), Math.min(recursive(0, Color.GREEN, arr), recursive(0, Color.BLUE, arr))) 33 | val result2 = Math.min(recursive(0, Color.RED, arr2), Math.min(recursive(0, Color.GREEN, arr2), recursive(0, Color.BLUE, arr2))) 34 | println(result) 35 | println(result2) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /scala/src/main/scala/RgbDistance2.scala: -------------------------------------------------------------------------------- 1 | object RgbDistance { 2 | object Colors extends Enumeration { 3 | val Red, Green, Blue = Value 4 | val size = values.size 5 | type Color = Value 6 | implicit def toInt(c: Color): Int = c.id 7 | implicit class ColorOps(color: Color) { 8 | def left: Color = Colors(Math.floorMod(color - 1, size)) 9 | def right: Color = Colors(Math.floorMod(color + 1, size)) 10 | } 11 | } 12 | 13 | import Colors._ 14 | type Houses = List[List[Int]] 15 | 16 | def process(inputs: Houses): Int = { 17 | def loop(color: Color, price: Int, remains: Houses): Int = { 18 | remains match { 19 | case Nil => price 20 | case h :: t => 21 | price + math.min( 22 | loop(color.left, h(color.left), t), 23 | loop(color.right, h(color.right), t)) 24 | } 25 | } 26 | 27 | inputs match { 28 | case h :: t => 29 | List(loop(Red, h(Red), t), 30 | loop(Green, h(Green), t), 31 | loop(Green, h(Green), t)).min 32 | } 33 | } 34 | } 35 | 36 | object Main extends App { 37 | val inputs1 = List(List(26, 40, 83), List(49, 60, 57), List(13, 89, 99)) 38 | val inputs2 = List(List(1, 20, 30), List(50, 5, 6), List(9, 3, 7)) 39 | val inputs3 = List(List(1, 2, 3), List(4, 5, 6)) 40 | println(RgbDistance.process(inputs1)) 41 | println(RgbDistance.process(inputs2)) 42 | println(RgbDistance.process(inputs3)) 43 | } 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /scala/src/main/scala/SaddlePoints.scala: -------------------------------------------------------------------------------- 1 | // exercism.io - 첫 번 째 풀이 2 | object SaddlePoints extends App { 3 | println(Matrix(List(List(9, 8, 7), List(5, 3, 2), List(6, 6, 7))).saddlePoints == Set((1, 0))) 4 | println(Matrix(List(List())).saddlePoints == Set()) 5 | println(Matrix(List(List(1, 2, 3), List(3, 1, 2), List(2, 3, 1))).saddlePoints == Set()) 6 | println(Matrix(List(List(4, 5, 4), List(3, 5, 5), List(1, 5, 4))).saddlePoints == Set((0, 1), (1, 1), (2, 1))) 7 | println(Matrix(List(List(8, 7, 9), List(6, 7, 6), List(3, 2, 5))).saddlePoints == Set((2, 2))) 8 | } 9 | 10 | case class Matrix(matrix: List[List[Int]]) { 11 | def saddlePoints: Set[(Int, Int)] = { 12 | matrix match { 13 | case Nil :: _ => Set() 14 | case _ => 15 | val rowsMax = matrix.map(_.max) 16 | val columnsMin = matrix.transpose.map(_.min) 17 | val ret = for { 18 | y <- 0 until matrix.size 19 | x <- 0 until matrix(y).size 20 | if matrix(y)(x) == rowsMax(y) && matrix(y)(x) == columnsMin(x) 21 | } yield (y, x) 22 | ret.toSet 23 | } 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | 2 | rootProject.name = 'algorithm' 3 | 4 | include 'java' 5 | include 'kotlin' 6 | include 'scala' 7 | include 'haskell' 8 | include 'javascript' -------------------------------------------------------------------------------- /swift/DigitalRoot/DigitalRoot.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F5FE3E871F53AB2D0062ACD7 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5FE3E861F53AB2D0062ACD7 /* main.swift */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXCopyFilesBuildPhase section */ 14 | F5FE3E811F53AB2D0062ACD7 /* CopyFiles */ = { 15 | isa = PBXCopyFilesBuildPhase; 16 | buildActionMask = 2147483647; 17 | dstPath = /usr/share/man/man1/; 18 | dstSubfolderSpec = 0; 19 | files = ( 20 | ); 21 | runOnlyForDeploymentPostprocessing = 1; 22 | }; 23 | /* End PBXCopyFilesBuildPhase section */ 24 | 25 | /* Begin PBXFileReference section */ 26 | F5FE3E831F53AB2D0062ACD7 /* DigitalRoot */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DigitalRoot; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | F5FE3E861F53AB2D0062ACD7 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | F5FE3E801F53AB2D0062ACD7 /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | F5FE3E7A1F53AB2D0062ACD7 = { 42 | isa = PBXGroup; 43 | children = ( 44 | F5FE3E851F53AB2D0062ACD7 /* DigitalRoot */, 45 | F5FE3E841F53AB2D0062ACD7 /* Products */, 46 | ); 47 | sourceTree = ""; 48 | }; 49 | F5FE3E841F53AB2D0062ACD7 /* Products */ = { 50 | isa = PBXGroup; 51 | children = ( 52 | F5FE3E831F53AB2D0062ACD7 /* DigitalRoot */, 53 | ); 54 | name = Products; 55 | sourceTree = ""; 56 | }; 57 | F5FE3E851F53AB2D0062ACD7 /* DigitalRoot */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | F5FE3E861F53AB2D0062ACD7 /* main.swift */, 61 | ); 62 | path = DigitalRoot; 63 | sourceTree = ""; 64 | }; 65 | /* End PBXGroup section */ 66 | 67 | /* Begin PBXNativeTarget section */ 68 | F5FE3E821F53AB2D0062ACD7 /* DigitalRoot */ = { 69 | isa = PBXNativeTarget; 70 | buildConfigurationList = F5FE3E8A1F53AB2D0062ACD7 /* Build configuration list for PBXNativeTarget "DigitalRoot" */; 71 | buildPhases = ( 72 | F5FE3E7F1F53AB2D0062ACD7 /* Sources */, 73 | F5FE3E801F53AB2D0062ACD7 /* Frameworks */, 74 | F5FE3E811F53AB2D0062ACD7 /* CopyFiles */, 75 | ); 76 | buildRules = ( 77 | ); 78 | dependencies = ( 79 | ); 80 | name = DigitalRoot; 81 | productName = DigitalRoot; 82 | productReference = F5FE3E831F53AB2D0062ACD7 /* DigitalRoot */; 83 | productType = "com.apple.product-type.tool"; 84 | }; 85 | /* End PBXNativeTarget section */ 86 | 87 | /* Begin PBXProject section */ 88 | F5FE3E7B1F53AB2D0062ACD7 /* Project object */ = { 89 | isa = PBXProject; 90 | attributes = { 91 | LastSwiftUpdateCheck = 0830; 92 | LastUpgradeCheck = 0830; 93 | ORGANIZATIONNAME = mbkyle; 94 | TargetAttributes = { 95 | F5FE3E821F53AB2D0062ACD7 = { 96 | CreatedOnToolsVersion = 8.3.3; 97 | ProvisioningStyle = Automatic; 98 | }; 99 | }; 100 | }; 101 | buildConfigurationList = F5FE3E7E1F53AB2D0062ACD7 /* Build configuration list for PBXProject "DigitalRoot" */; 102 | compatibilityVersion = "Xcode 3.2"; 103 | developmentRegion = English; 104 | hasScannedForEncodings = 0; 105 | knownRegions = ( 106 | en, 107 | ); 108 | mainGroup = F5FE3E7A1F53AB2D0062ACD7; 109 | productRefGroup = F5FE3E841F53AB2D0062ACD7 /* Products */; 110 | projectDirPath = ""; 111 | projectRoot = ""; 112 | targets = ( 113 | F5FE3E821F53AB2D0062ACD7 /* DigitalRoot */, 114 | ); 115 | }; 116 | /* End PBXProject section */ 117 | 118 | /* Begin PBXSourcesBuildPhase section */ 119 | F5FE3E7F1F53AB2D0062ACD7 /* Sources */ = { 120 | isa = PBXSourcesBuildPhase; 121 | buildActionMask = 2147483647; 122 | files = ( 123 | F5FE3E871F53AB2D0062ACD7 /* main.swift in Sources */, 124 | ); 125 | runOnlyForDeploymentPostprocessing = 0; 126 | }; 127 | /* End PBXSourcesBuildPhase section */ 128 | 129 | /* Begin XCBuildConfiguration section */ 130 | F5FE3E881F53AB2D0062ACD7 /* Debug */ = { 131 | isa = XCBuildConfiguration; 132 | buildSettings = { 133 | ALWAYS_SEARCH_USER_PATHS = NO; 134 | CLANG_ANALYZER_NONNULL = YES; 135 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 136 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 137 | CLANG_CXX_LIBRARY = "libc++"; 138 | CLANG_ENABLE_MODULES = YES; 139 | CLANG_ENABLE_OBJC_ARC = YES; 140 | CLANG_WARN_BOOL_CONVERSION = YES; 141 | CLANG_WARN_CONSTANT_CONVERSION = YES; 142 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 143 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 144 | CLANG_WARN_EMPTY_BODY = YES; 145 | CLANG_WARN_ENUM_CONVERSION = YES; 146 | CLANG_WARN_INFINITE_RECURSION = YES; 147 | CLANG_WARN_INT_CONVERSION = YES; 148 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 149 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 150 | CLANG_WARN_UNREACHABLE_CODE = YES; 151 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 152 | CODE_SIGN_IDENTITY = "-"; 153 | COPY_PHASE_STRIP = NO; 154 | DEBUG_INFORMATION_FORMAT = dwarf; 155 | ENABLE_STRICT_OBJC_MSGSEND = YES; 156 | ENABLE_TESTABILITY = YES; 157 | GCC_C_LANGUAGE_STANDARD = gnu99; 158 | GCC_DYNAMIC_NO_PIC = NO; 159 | GCC_NO_COMMON_BLOCKS = YES; 160 | GCC_OPTIMIZATION_LEVEL = 0; 161 | GCC_PREPROCESSOR_DEFINITIONS = ( 162 | "DEBUG=1", 163 | "$(inherited)", 164 | ); 165 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 166 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 167 | GCC_WARN_UNDECLARED_SELECTOR = YES; 168 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 169 | GCC_WARN_UNUSED_FUNCTION = YES; 170 | GCC_WARN_UNUSED_VARIABLE = YES; 171 | MACOSX_DEPLOYMENT_TARGET = 10.12; 172 | MTL_ENABLE_DEBUG_INFO = YES; 173 | ONLY_ACTIVE_ARCH = YES; 174 | SDKROOT = macosx; 175 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 176 | }; 177 | name = Debug; 178 | }; 179 | F5FE3E891F53AB2D0062ACD7 /* Release */ = { 180 | isa = XCBuildConfiguration; 181 | buildSettings = { 182 | ALWAYS_SEARCH_USER_PATHS = NO; 183 | CLANG_ANALYZER_NONNULL = YES; 184 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 185 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 186 | CLANG_CXX_LIBRARY = "libc++"; 187 | CLANG_ENABLE_MODULES = YES; 188 | CLANG_ENABLE_OBJC_ARC = YES; 189 | CLANG_WARN_BOOL_CONVERSION = YES; 190 | CLANG_WARN_CONSTANT_CONVERSION = YES; 191 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 192 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 193 | CLANG_WARN_EMPTY_BODY = YES; 194 | CLANG_WARN_ENUM_CONVERSION = YES; 195 | CLANG_WARN_INFINITE_RECURSION = YES; 196 | CLANG_WARN_INT_CONVERSION = YES; 197 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 198 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 199 | CLANG_WARN_UNREACHABLE_CODE = YES; 200 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 201 | CODE_SIGN_IDENTITY = "-"; 202 | COPY_PHASE_STRIP = NO; 203 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 204 | ENABLE_NS_ASSERTIONS = NO; 205 | ENABLE_STRICT_OBJC_MSGSEND = YES; 206 | GCC_C_LANGUAGE_STANDARD = gnu99; 207 | GCC_NO_COMMON_BLOCKS = YES; 208 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 209 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 210 | GCC_WARN_UNDECLARED_SELECTOR = YES; 211 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 212 | GCC_WARN_UNUSED_FUNCTION = YES; 213 | GCC_WARN_UNUSED_VARIABLE = YES; 214 | MACOSX_DEPLOYMENT_TARGET = 10.12; 215 | MTL_ENABLE_DEBUG_INFO = NO; 216 | SDKROOT = macosx; 217 | }; 218 | name = Release; 219 | }; 220 | F5FE3E8B1F53AB2D0062ACD7 /* Debug */ = { 221 | isa = XCBuildConfiguration; 222 | buildSettings = { 223 | PRODUCT_NAME = "$(TARGET_NAME)"; 224 | SWIFT_VERSION = 3.0; 225 | }; 226 | name = Debug; 227 | }; 228 | F5FE3E8C1F53AB2D0062ACD7 /* Release */ = { 229 | isa = XCBuildConfiguration; 230 | buildSettings = { 231 | PRODUCT_NAME = "$(TARGET_NAME)"; 232 | SWIFT_VERSION = 3.0; 233 | }; 234 | name = Release; 235 | }; 236 | /* End XCBuildConfiguration section */ 237 | 238 | /* Begin XCConfigurationList section */ 239 | F5FE3E7E1F53AB2D0062ACD7 /* Build configuration list for PBXProject "DigitalRoot" */ = { 240 | isa = XCConfigurationList; 241 | buildConfigurations = ( 242 | F5FE3E881F53AB2D0062ACD7 /* Debug */, 243 | F5FE3E891F53AB2D0062ACD7 /* Release */, 244 | ); 245 | defaultConfigurationIsVisible = 0; 246 | defaultConfigurationName = Release; 247 | }; 248 | F5FE3E8A1F53AB2D0062ACD7 /* Build configuration list for PBXNativeTarget "DigitalRoot" */ = { 249 | isa = XCConfigurationList; 250 | buildConfigurations = ( 251 | F5FE3E8B1F53AB2D0062ACD7 /* Debug */, 252 | F5FE3E8C1F53AB2D0062ACD7 /* Release */, 253 | ); 254 | defaultConfigurationIsVisible = 0; 255 | }; 256 | /* End XCConfigurationList section */ 257 | }; 258 | rootObject = F5FE3E7B1F53AB2D0062ACD7 /* Project object */; 259 | } 260 | -------------------------------------------------------------------------------- /swift/DigitalRoot/DigitalRoot.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /swift/DigitalRoot/DigitalRoot.xcodeproj/xcuserdata/MBKWON.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /swift/DigitalRoot/DigitalRoot.xcodeproj/xcuserdata/MBKWON.xcuserdatad/xcschemes/DigitalRoot.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /swift/DigitalRoot/DigitalRoot/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // DigitalRoot 4 | // 5 | // Created by Moonbeom KWON on 2017. 8. 28.. 6 | // Copyright © 2017년 mbkyle. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | print("Hello, World!") 12 | 13 | var inputList: NSMutableArray = NSMutableArray() 14 | 15 | repeat { 16 | if let input: String = readLine() { 17 | if Int(input) == 0 { 18 | break 19 | } else if input.trimmingCharacters(in: .whitespaces).characters.count > 0 { 20 | inputList.add(input) 21 | } 22 | } 23 | 24 | } while true 25 | 26 | 27 | func getDigitalRoot(input: String) -> Int { 28 | let rootNumber: Int = Array(input.characters).map{ Int(String($0))! }.reduce(0, +) 29 | 30 | if rootNumber > 10 { 31 | return getDigitalRoot(input: String(rootNumber)) 32 | 33 | } else { 34 | return rootNumber 35 | } 36 | } 37 | 38 | 39 | print("\n\n") 40 | for inputString in inputList { 41 | if let input = inputString as? String { 42 | print(getDigitalRoot(input: input)) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 22987E641F39D6B200A5DC83 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22987E631F39D6B200A5DC83 /* main.swift */; }; 11 | 22987E6B1F39EC8600A5DC83 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22987E6A1F39EC8600A5DC83 /* Extensions.swift */; }; 12 | /* End PBXBuildFile section */ 13 | 14 | /* Begin PBXCopyFilesBuildPhase section */ 15 | 22987E5E1F39D6B100A5DC83 /* CopyFiles */ = { 16 | isa = PBXCopyFilesBuildPhase; 17 | buildActionMask = 2147483647; 18 | dstPath = /usr/share/man/man1/; 19 | dstSubfolderSpec = 0; 20 | files = ( 21 | ); 22 | runOnlyForDeploymentPostprocessing = 1; 23 | }; 24 | /* End PBXCopyFilesBuildPhase section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | 22987E601F39D6B200A5DC83 /* DrawRect */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DrawRect; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 22987E631F39D6B200A5DC83 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 29 | 22987E6A1F39EC8600A5DC83 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 30 | /* End PBXFileReference section */ 31 | 32 | /* Begin PBXFrameworksBuildPhase section */ 33 | 22987E5D1F39D6B100A5DC83 /* Frameworks */ = { 34 | isa = PBXFrameworksBuildPhase; 35 | buildActionMask = 2147483647; 36 | files = ( 37 | ); 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXFrameworksBuildPhase section */ 41 | 42 | /* Begin PBXGroup section */ 43 | 22987E571F39D6B100A5DC83 = { 44 | isa = PBXGroup; 45 | children = ( 46 | 22987E621F39D6B200A5DC83 /* DrawRect */, 47 | 22987E611F39D6B200A5DC83 /* Products */, 48 | ); 49 | sourceTree = ""; 50 | }; 51 | 22987E611F39D6B200A5DC83 /* Products */ = { 52 | isa = PBXGroup; 53 | children = ( 54 | 22987E601F39D6B200A5DC83 /* DrawRect */, 55 | ); 56 | name = Products; 57 | sourceTree = ""; 58 | }; 59 | 22987E621F39D6B200A5DC83 /* DrawRect */ = { 60 | isa = PBXGroup; 61 | children = ( 62 | 22987E631F39D6B200A5DC83 /* main.swift */, 63 | 22987E6A1F39EC8600A5DC83 /* Extensions.swift */, 64 | ); 65 | path = DrawRect; 66 | sourceTree = ""; 67 | }; 68 | /* End PBXGroup section */ 69 | 70 | /* Begin PBXNativeTarget section */ 71 | 22987E5F1F39D6B100A5DC83 /* DrawRect */ = { 72 | isa = PBXNativeTarget; 73 | buildConfigurationList = 22987E671F39D6B200A5DC83 /* Build configuration list for PBXNativeTarget "DrawRect" */; 74 | buildPhases = ( 75 | 22987E5C1F39D6B100A5DC83 /* Sources */, 76 | 22987E5D1F39D6B100A5DC83 /* Frameworks */, 77 | 22987E5E1F39D6B100A5DC83 /* CopyFiles */, 78 | ); 79 | buildRules = ( 80 | ); 81 | dependencies = ( 82 | ); 83 | name = DrawRect; 84 | productName = DrawRect; 85 | productReference = 22987E601F39D6B200A5DC83 /* DrawRect */; 86 | productType = "com.apple.product-type.tool"; 87 | }; 88 | /* End PBXNativeTarget section */ 89 | 90 | /* Begin PBXProject section */ 91 | 22987E581F39D6B100A5DC83 /* Project object */ = { 92 | isa = PBXProject; 93 | attributes = { 94 | LastSwiftUpdateCheck = 0830; 95 | LastUpgradeCheck = 0830; 96 | ORGANIZATIONNAME = "박새미"; 97 | TargetAttributes = { 98 | 22987E5F1F39D6B100A5DC83 = { 99 | CreatedOnToolsVersion = 8.3.3; 100 | ProvisioningStyle = Automatic; 101 | }; 102 | }; 103 | }; 104 | buildConfigurationList = 22987E5B1F39D6B100A5DC83 /* Build configuration list for PBXProject "DrawRect" */; 105 | compatibilityVersion = "Xcode 3.2"; 106 | developmentRegion = English; 107 | hasScannedForEncodings = 0; 108 | knownRegions = ( 109 | en, 110 | ); 111 | mainGroup = 22987E571F39D6B100A5DC83; 112 | productRefGroup = 22987E611F39D6B200A5DC83 /* Products */; 113 | projectDirPath = ""; 114 | projectRoot = ""; 115 | targets = ( 116 | 22987E5F1F39D6B100A5DC83 /* DrawRect */, 117 | ); 118 | }; 119 | /* End PBXProject section */ 120 | 121 | /* Begin PBXSourcesBuildPhase section */ 122 | 22987E5C1F39D6B100A5DC83 /* Sources */ = { 123 | isa = PBXSourcesBuildPhase; 124 | buildActionMask = 2147483647; 125 | files = ( 126 | 22987E641F39D6B200A5DC83 /* main.swift in Sources */, 127 | 22987E6B1F39EC8600A5DC83 /* Extensions.swift in Sources */, 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | /* End PBXSourcesBuildPhase section */ 132 | 133 | /* Begin XCBuildConfiguration section */ 134 | 22987E651F39D6B200A5DC83 /* Debug */ = { 135 | isa = XCBuildConfiguration; 136 | buildSettings = { 137 | ALWAYS_SEARCH_USER_PATHS = NO; 138 | CLANG_ANALYZER_NONNULL = YES; 139 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 140 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 141 | CLANG_CXX_LIBRARY = "libc++"; 142 | CLANG_ENABLE_MODULES = YES; 143 | CLANG_ENABLE_OBJC_ARC = YES; 144 | CLANG_WARN_BOOL_CONVERSION = YES; 145 | CLANG_WARN_CONSTANT_CONVERSION = YES; 146 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 147 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 148 | CLANG_WARN_EMPTY_BODY = YES; 149 | CLANG_WARN_ENUM_CONVERSION = YES; 150 | CLANG_WARN_INFINITE_RECURSION = YES; 151 | CLANG_WARN_INT_CONVERSION = YES; 152 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 153 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 154 | CLANG_WARN_UNREACHABLE_CODE = YES; 155 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 156 | CODE_SIGN_IDENTITY = "-"; 157 | COPY_PHASE_STRIP = NO; 158 | DEBUG_INFORMATION_FORMAT = dwarf; 159 | ENABLE_STRICT_OBJC_MSGSEND = YES; 160 | ENABLE_TESTABILITY = YES; 161 | GCC_C_LANGUAGE_STANDARD = gnu99; 162 | GCC_DYNAMIC_NO_PIC = NO; 163 | GCC_NO_COMMON_BLOCKS = YES; 164 | GCC_OPTIMIZATION_LEVEL = 0; 165 | GCC_PREPROCESSOR_DEFINITIONS = ( 166 | "DEBUG=1", 167 | "$(inherited)", 168 | ); 169 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 170 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 171 | GCC_WARN_UNDECLARED_SELECTOR = YES; 172 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 173 | GCC_WARN_UNUSED_FUNCTION = YES; 174 | GCC_WARN_UNUSED_VARIABLE = YES; 175 | MACOSX_DEPLOYMENT_TARGET = 10.12; 176 | MTL_ENABLE_DEBUG_INFO = YES; 177 | ONLY_ACTIVE_ARCH = YES; 178 | SDKROOT = macosx; 179 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 180 | }; 181 | name = Debug; 182 | }; 183 | 22987E661F39D6B200A5DC83 /* Release */ = { 184 | isa = XCBuildConfiguration; 185 | buildSettings = { 186 | ALWAYS_SEARCH_USER_PATHS = NO; 187 | CLANG_ANALYZER_NONNULL = YES; 188 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 189 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 190 | CLANG_CXX_LIBRARY = "libc++"; 191 | CLANG_ENABLE_MODULES = YES; 192 | CLANG_ENABLE_OBJC_ARC = YES; 193 | CLANG_WARN_BOOL_CONVERSION = YES; 194 | CLANG_WARN_CONSTANT_CONVERSION = YES; 195 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 196 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 197 | CLANG_WARN_EMPTY_BODY = YES; 198 | CLANG_WARN_ENUM_CONVERSION = YES; 199 | CLANG_WARN_INFINITE_RECURSION = YES; 200 | CLANG_WARN_INT_CONVERSION = YES; 201 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 202 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 203 | CLANG_WARN_UNREACHABLE_CODE = YES; 204 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 205 | CODE_SIGN_IDENTITY = "-"; 206 | COPY_PHASE_STRIP = NO; 207 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 208 | ENABLE_NS_ASSERTIONS = NO; 209 | ENABLE_STRICT_OBJC_MSGSEND = YES; 210 | GCC_C_LANGUAGE_STANDARD = gnu99; 211 | GCC_NO_COMMON_BLOCKS = YES; 212 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 213 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 214 | GCC_WARN_UNDECLARED_SELECTOR = YES; 215 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 216 | GCC_WARN_UNUSED_FUNCTION = YES; 217 | GCC_WARN_UNUSED_VARIABLE = YES; 218 | MACOSX_DEPLOYMENT_TARGET = 10.12; 219 | MTL_ENABLE_DEBUG_INFO = NO; 220 | SDKROOT = macosx; 221 | }; 222 | name = Release; 223 | }; 224 | 22987E681F39D6B200A5DC83 /* Debug */ = { 225 | isa = XCBuildConfiguration; 226 | buildSettings = { 227 | PRODUCT_NAME = "$(TARGET_NAME)"; 228 | SWIFT_VERSION = 3.0; 229 | }; 230 | name = Debug; 231 | }; 232 | 22987E691F39D6B200A5DC83 /* Release */ = { 233 | isa = XCBuildConfiguration; 234 | buildSettings = { 235 | PRODUCT_NAME = "$(TARGET_NAME)"; 236 | SWIFT_VERSION = 3.0; 237 | }; 238 | name = Release; 239 | }; 240 | /* End XCBuildConfiguration section */ 241 | 242 | /* Begin XCConfigurationList section */ 243 | 22987E5B1F39D6B100A5DC83 /* Build configuration list for PBXProject "DrawRect" */ = { 244 | isa = XCConfigurationList; 245 | buildConfigurations = ( 246 | 22987E651F39D6B200A5DC83 /* Debug */, 247 | 22987E661F39D6B200A5DC83 /* Release */, 248 | ); 249 | defaultConfigurationIsVisible = 0; 250 | defaultConfigurationName = Release; 251 | }; 252 | 22987E671F39D6B200A5DC83 /* Build configuration list for PBXNativeTarget "DrawRect" */ = { 253 | isa = XCConfigurationList; 254 | buildConfigurations = ( 255 | 22987E681F39D6B200A5DC83 /* Debug */, 256 | 22987E691F39D6B200A5DC83 /* Release */, 257 | ); 258 | defaultConfigurationIsVisible = 0; 259 | }; 260 | /* End XCConfigurationList section */ 261 | }; 262 | rootObject = 22987E581F39D6B100A5DC83 /* Project object */; 263 | } 264 | -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect.xcodeproj/project.xcworkspace/xcuserdata/sam.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/funfunStudy/algorithm/a207e4db320e8126169154aa1a7a96a58c71785f/swift/DrawRect/DrawRect.xcodeproj/project.xcworkspace/xcuserdata/sam.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect.xcodeproj/xcuserdata/sam.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect.xcodeproj/xcuserdata/sam.xcuserdatad/xcschemes/DrawRect.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect.xcodeproj/xcuserdata/sam.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | DrawRect.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 22987E5F1F39D6B100A5DC83 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect/Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extensions.swift 3 | // DrawRect 4 | // 5 | // Created by 박새미 on 2017. 8. 8.. 6 | // Copyright © 2017년 박새미. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | 13 | extension String { 14 | 15 | var floatValue: Float { 16 | return (self as NSString).floatValue 17 | } 18 | 19 | 20 | var pointVlaue: CGPoint? { 21 | let components = self.components(separatedBy: " ") 22 | if components.count > 1 { 23 | return CGPoint(x: CGFloat(components[0].floatValue), 24 | y: CGFloat(components[1].floatValue)) 25 | 26 | } else { 27 | return nil 28 | } 29 | } 30 | } 31 | 32 | 33 | extension Array where Element == CGFloat { 34 | 35 | func getResult() -> CGFloat { 36 | if self.dropFirst().contains(self.first!) { 37 | return self.filter(){ $0 != self.first }.first! 38 | } else { 39 | return self.first! 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /swift/DrawRect/DrawRect/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // DrawRect 4 | // 5 | // Created by 박새미 on 2017. 8. 8.. 6 | // Copyright © 2017년 박새미. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | print("문제의 수를 입력?") 13 | 14 | 15 | func getAnotherPoint(points: Array) -> CGPoint { 16 | return CGPoint(x: points.map{ $0.x }.getResult(), 17 | y: points.map{ $0.y }.getResult()) 18 | } 19 | 20 | 21 | func inputThreePoints() -> Array { 22 | 23 | var points = Array() 24 | for _ in 1...3 { 25 | if let point = readLine()?.pointVlaue { 26 | points.append(point) 27 | 28 | } else { 29 | exit(1) 30 | } 31 | } 32 | 33 | return points 34 | } 35 | 36 | 37 | if let response = readLine() { 38 | let inputNum = Int(response)! 39 | for _ in 1...inputNum { 40 | print( getAnotherPoint(points: inputThreePoints()) ) 41 | } 42 | 43 | } 44 | 45 | -------------------------------------------------------------------------------- /swift/HelloSwift/HelloSwift.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F5269B511EF900820011F972 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5269B501EF900820011F972 /* main.swift */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXCopyFilesBuildPhase section */ 14 | F5269B4B1EF900820011F972 /* CopyFiles */ = { 15 | isa = PBXCopyFilesBuildPhase; 16 | buildActionMask = 2147483647; 17 | dstPath = /usr/share/man/man1/; 18 | dstSubfolderSpec = 0; 19 | files = ( 20 | ); 21 | runOnlyForDeploymentPostprocessing = 1; 22 | }; 23 | /* End PBXCopyFilesBuildPhase section */ 24 | 25 | /* Begin PBXFileReference section */ 26 | F5269B4D1EF900820011F972 /* HelloSwift */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = HelloSwift; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | F5269B501EF900820011F972 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | F5269B4A1EF900820011F972 /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | F5269B441EF900820011F972 = { 42 | isa = PBXGroup; 43 | children = ( 44 | F5269B4F1EF900820011F972 /* HelloSwift */, 45 | F5269B4E1EF900820011F972 /* Products */, 46 | ); 47 | sourceTree = ""; 48 | }; 49 | F5269B4E1EF900820011F972 /* Products */ = { 50 | isa = PBXGroup; 51 | children = ( 52 | F5269B4D1EF900820011F972 /* HelloSwift */, 53 | ); 54 | name = Products; 55 | sourceTree = ""; 56 | }; 57 | F5269B4F1EF900820011F972 /* HelloSwift */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | F5269B501EF900820011F972 /* main.swift */, 61 | ); 62 | path = HelloSwift; 63 | sourceTree = ""; 64 | }; 65 | /* End PBXGroup section */ 66 | 67 | /* Begin PBXNativeTarget section */ 68 | F5269B4C1EF900820011F972 /* HelloSwift */ = { 69 | isa = PBXNativeTarget; 70 | buildConfigurationList = F5269B541EF900820011F972 /* Build configuration list for PBXNativeTarget "HelloSwift" */; 71 | buildPhases = ( 72 | F5269B491EF900820011F972 /* Sources */, 73 | F5269B4A1EF900820011F972 /* Frameworks */, 74 | F5269B4B1EF900820011F972 /* CopyFiles */, 75 | ); 76 | buildRules = ( 77 | ); 78 | dependencies = ( 79 | ); 80 | name = HelloSwift; 81 | productName = HelloSwift; 82 | productReference = F5269B4D1EF900820011F972 /* HelloSwift */; 83 | productType = "com.apple.product-type.tool"; 84 | }; 85 | /* End PBXNativeTarget section */ 86 | 87 | /* Begin PBXProject section */ 88 | F5269B451EF900820011F972 /* Project object */ = { 89 | isa = PBXProject; 90 | attributes = { 91 | LastSwiftUpdateCheck = 0830; 92 | LastUpgradeCheck = 0830; 93 | ORGANIZATIONNAME = mbkyle; 94 | TargetAttributes = { 95 | F5269B4C1EF900820011F972 = { 96 | CreatedOnToolsVersion = 8.3.3; 97 | ProvisioningStyle = Automatic; 98 | }; 99 | }; 100 | }; 101 | buildConfigurationList = F5269B481EF900820011F972 /* Build configuration list for PBXProject "HelloSwift" */; 102 | compatibilityVersion = "Xcode 3.2"; 103 | developmentRegion = English; 104 | hasScannedForEncodings = 0; 105 | knownRegions = ( 106 | en, 107 | ); 108 | mainGroup = F5269B441EF900820011F972; 109 | productRefGroup = F5269B4E1EF900820011F972 /* Products */; 110 | projectDirPath = ""; 111 | projectRoot = ""; 112 | targets = ( 113 | F5269B4C1EF900820011F972 /* HelloSwift */, 114 | ); 115 | }; 116 | /* End PBXProject section */ 117 | 118 | /* Begin PBXSourcesBuildPhase section */ 119 | F5269B491EF900820011F972 /* Sources */ = { 120 | isa = PBXSourcesBuildPhase; 121 | buildActionMask = 2147483647; 122 | files = ( 123 | F5269B511EF900820011F972 /* main.swift in Sources */, 124 | ); 125 | runOnlyForDeploymentPostprocessing = 0; 126 | }; 127 | /* End PBXSourcesBuildPhase section */ 128 | 129 | /* Begin XCBuildConfiguration section */ 130 | F5269B521EF900820011F972 /* Debug */ = { 131 | isa = XCBuildConfiguration; 132 | buildSettings = { 133 | ALWAYS_SEARCH_USER_PATHS = NO; 134 | CLANG_ANALYZER_NONNULL = YES; 135 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 136 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 137 | CLANG_CXX_LIBRARY = "libc++"; 138 | CLANG_ENABLE_MODULES = YES; 139 | CLANG_ENABLE_OBJC_ARC = YES; 140 | CLANG_WARN_BOOL_CONVERSION = YES; 141 | CLANG_WARN_CONSTANT_CONVERSION = YES; 142 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 143 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 144 | CLANG_WARN_EMPTY_BODY = YES; 145 | CLANG_WARN_ENUM_CONVERSION = YES; 146 | CLANG_WARN_INFINITE_RECURSION = YES; 147 | CLANG_WARN_INT_CONVERSION = YES; 148 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 149 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 150 | CLANG_WARN_UNREACHABLE_CODE = YES; 151 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 152 | CODE_SIGN_IDENTITY = "-"; 153 | COPY_PHASE_STRIP = NO; 154 | DEBUG_INFORMATION_FORMAT = dwarf; 155 | ENABLE_STRICT_OBJC_MSGSEND = YES; 156 | ENABLE_TESTABILITY = YES; 157 | GCC_C_LANGUAGE_STANDARD = gnu99; 158 | GCC_DYNAMIC_NO_PIC = NO; 159 | GCC_NO_COMMON_BLOCKS = YES; 160 | GCC_OPTIMIZATION_LEVEL = 0; 161 | GCC_PREPROCESSOR_DEFINITIONS = ( 162 | "DEBUG=1", 163 | "$(inherited)", 164 | ); 165 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 166 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 167 | GCC_WARN_UNDECLARED_SELECTOR = YES; 168 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 169 | GCC_WARN_UNUSED_FUNCTION = YES; 170 | GCC_WARN_UNUSED_VARIABLE = YES; 171 | MACOSX_DEPLOYMENT_TARGET = 10.12; 172 | MTL_ENABLE_DEBUG_INFO = YES; 173 | ONLY_ACTIVE_ARCH = YES; 174 | SDKROOT = macosx; 175 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 176 | }; 177 | name = Debug; 178 | }; 179 | F5269B531EF900820011F972 /* Release */ = { 180 | isa = XCBuildConfiguration; 181 | buildSettings = { 182 | ALWAYS_SEARCH_USER_PATHS = NO; 183 | CLANG_ANALYZER_NONNULL = YES; 184 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 185 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 186 | CLANG_CXX_LIBRARY = "libc++"; 187 | CLANG_ENABLE_MODULES = YES; 188 | CLANG_ENABLE_OBJC_ARC = YES; 189 | CLANG_WARN_BOOL_CONVERSION = YES; 190 | CLANG_WARN_CONSTANT_CONVERSION = YES; 191 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 192 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 193 | CLANG_WARN_EMPTY_BODY = YES; 194 | CLANG_WARN_ENUM_CONVERSION = YES; 195 | CLANG_WARN_INFINITE_RECURSION = YES; 196 | CLANG_WARN_INT_CONVERSION = YES; 197 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 198 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 199 | CLANG_WARN_UNREACHABLE_CODE = YES; 200 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 201 | CODE_SIGN_IDENTITY = "-"; 202 | COPY_PHASE_STRIP = NO; 203 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 204 | ENABLE_NS_ASSERTIONS = NO; 205 | ENABLE_STRICT_OBJC_MSGSEND = YES; 206 | GCC_C_LANGUAGE_STANDARD = gnu99; 207 | GCC_NO_COMMON_BLOCKS = YES; 208 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 209 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 210 | GCC_WARN_UNDECLARED_SELECTOR = YES; 211 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 212 | GCC_WARN_UNUSED_FUNCTION = YES; 213 | GCC_WARN_UNUSED_VARIABLE = YES; 214 | MACOSX_DEPLOYMENT_TARGET = 10.12; 215 | MTL_ENABLE_DEBUG_INFO = NO; 216 | SDKROOT = macosx; 217 | }; 218 | name = Release; 219 | }; 220 | F5269B551EF900820011F972 /* Debug */ = { 221 | isa = XCBuildConfiguration; 222 | buildSettings = { 223 | PRODUCT_NAME = "$(TARGET_NAME)"; 224 | SWIFT_VERSION = 3.0; 225 | }; 226 | name = Debug; 227 | }; 228 | F5269B561EF900820011F972 /* Release */ = { 229 | isa = XCBuildConfiguration; 230 | buildSettings = { 231 | PRODUCT_NAME = "$(TARGET_NAME)"; 232 | SWIFT_VERSION = 3.0; 233 | }; 234 | name = Release; 235 | }; 236 | /* End XCBuildConfiguration section */ 237 | 238 | /* Begin XCConfigurationList section */ 239 | F5269B481EF900820011F972 /* Build configuration list for PBXProject "HelloSwift" */ = { 240 | isa = XCConfigurationList; 241 | buildConfigurations = ( 242 | F5269B521EF900820011F972 /* Debug */, 243 | F5269B531EF900820011F972 /* Release */, 244 | ); 245 | defaultConfigurationIsVisible = 0; 246 | defaultConfigurationName = Release; 247 | }; 248 | F5269B541EF900820011F972 /* Build configuration list for PBXNativeTarget "HelloSwift" */ = { 249 | isa = XCConfigurationList; 250 | buildConfigurations = ( 251 | F5269B551EF900820011F972 /* Debug */, 252 | F5269B561EF900820011F972 /* Release */, 253 | ); 254 | defaultConfigurationIsVisible = 0; 255 | defaultConfigurationName = Release; 256 | }; 257 | /* End XCConfigurationList section */ 258 | }; 259 | rootObject = F5269B451EF900820011F972 /* Project object */; 260 | } 261 | -------------------------------------------------------------------------------- /swift/HelloSwift/HelloSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /swift/HelloSwift/HelloSwift.xcodeproj/xcuserdata/MBKWON.xcuserdatad/xcschemes/HelloSwift.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /swift/HelloSwift/HelloSwift/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // HelloSwift 4 | // 5 | // Created by Moonbeom KWON on 2017. 6. 20.. 6 | // Copyright © 2017년 mbkyle. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | print("Hello, World!") 12 | 13 | let response = readLine(strippingNewline: true) 14 | 15 | if let text = response { 16 | print( text ) 17 | } 18 | -------------------------------------------------------------------------------- /swift/PriyankaAndToys/PriyankaAndToys.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F59739831F04AAF500FAC3D8 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59739821F04AAF500FAC3D8 /* main.swift */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXCopyFilesBuildPhase section */ 14 | F597397D1F04AAF500FAC3D8 /* CopyFiles */ = { 15 | isa = PBXCopyFilesBuildPhase; 16 | buildActionMask = 2147483647; 17 | dstPath = /usr/share/man/man1/; 18 | dstSubfolderSpec = 0; 19 | files = ( 20 | ); 21 | runOnlyForDeploymentPostprocessing = 1; 22 | }; 23 | /* End PBXCopyFilesBuildPhase section */ 24 | 25 | /* Begin PBXFileReference section */ 26 | F597397F1F04AAF500FAC3D8 /* PriyankaAndToys */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = PriyankaAndToys; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | F59739821F04AAF500FAC3D8 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | F597397C1F04AAF500FAC3D8 /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | F59739761F04AAF500FAC3D8 = { 42 | isa = PBXGroup; 43 | children = ( 44 | F59739811F04AAF500FAC3D8 /* PriyankaAndToys */, 45 | F59739801F04AAF500FAC3D8 /* Products */, 46 | ); 47 | sourceTree = ""; 48 | }; 49 | F59739801F04AAF500FAC3D8 /* Products */ = { 50 | isa = PBXGroup; 51 | children = ( 52 | F597397F1F04AAF500FAC3D8 /* PriyankaAndToys */, 53 | ); 54 | name = Products; 55 | sourceTree = ""; 56 | }; 57 | F59739811F04AAF500FAC3D8 /* PriyankaAndToys */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | F59739821F04AAF500FAC3D8 /* main.swift */, 61 | ); 62 | path = PriyankaAndToys; 63 | sourceTree = ""; 64 | }; 65 | /* End PBXGroup section */ 66 | 67 | /* Begin PBXNativeTarget section */ 68 | F597397E1F04AAF500FAC3D8 /* PriyankaAndToys */ = { 69 | isa = PBXNativeTarget; 70 | buildConfigurationList = F59739861F04AAF500FAC3D8 /* Build configuration list for PBXNativeTarget "PriyankaAndToys" */; 71 | buildPhases = ( 72 | F597397B1F04AAF500FAC3D8 /* Sources */, 73 | F597397C1F04AAF500FAC3D8 /* Frameworks */, 74 | F597397D1F04AAF500FAC3D8 /* CopyFiles */, 75 | ); 76 | buildRules = ( 77 | ); 78 | dependencies = ( 79 | ); 80 | name = PriyankaAndToys; 81 | productName = PriyankaAndToys; 82 | productReference = F597397F1F04AAF500FAC3D8 /* PriyankaAndToys */; 83 | productType = "com.apple.product-type.tool"; 84 | }; 85 | /* End PBXNativeTarget section */ 86 | 87 | /* Begin PBXProject section */ 88 | F59739771F04AAF500FAC3D8 /* Project object */ = { 89 | isa = PBXProject; 90 | attributes = { 91 | LastSwiftUpdateCheck = 0830; 92 | LastUpgradeCheck = 0830; 93 | ORGANIZATIONNAME = mbkyle; 94 | TargetAttributes = { 95 | F597397E1F04AAF500FAC3D8 = { 96 | CreatedOnToolsVersion = 8.3.3; 97 | ProvisioningStyle = Automatic; 98 | }; 99 | }; 100 | }; 101 | buildConfigurationList = F597397A1F04AAF500FAC3D8 /* Build configuration list for PBXProject "PriyankaAndToys" */; 102 | compatibilityVersion = "Xcode 3.2"; 103 | developmentRegion = English; 104 | hasScannedForEncodings = 0; 105 | knownRegions = ( 106 | en, 107 | ); 108 | mainGroup = F59739761F04AAF500FAC3D8; 109 | productRefGroup = F59739801F04AAF500FAC3D8 /* Products */; 110 | projectDirPath = ""; 111 | projectRoot = ""; 112 | targets = ( 113 | F597397E1F04AAF500FAC3D8 /* PriyankaAndToys */, 114 | ); 115 | }; 116 | /* End PBXProject section */ 117 | 118 | /* Begin PBXSourcesBuildPhase section */ 119 | F597397B1F04AAF500FAC3D8 /* Sources */ = { 120 | isa = PBXSourcesBuildPhase; 121 | buildActionMask = 2147483647; 122 | files = ( 123 | F59739831F04AAF500FAC3D8 /* main.swift in Sources */, 124 | ); 125 | runOnlyForDeploymentPostprocessing = 0; 126 | }; 127 | /* End PBXSourcesBuildPhase section */ 128 | 129 | /* Begin XCBuildConfiguration section */ 130 | F59739841F04AAF500FAC3D8 /* Debug */ = { 131 | isa = XCBuildConfiguration; 132 | buildSettings = { 133 | ALWAYS_SEARCH_USER_PATHS = NO; 134 | CLANG_ANALYZER_NONNULL = YES; 135 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 136 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 137 | CLANG_CXX_LIBRARY = "libc++"; 138 | CLANG_ENABLE_MODULES = YES; 139 | CLANG_ENABLE_OBJC_ARC = YES; 140 | CLANG_WARN_BOOL_CONVERSION = YES; 141 | CLANG_WARN_CONSTANT_CONVERSION = YES; 142 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 143 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 144 | CLANG_WARN_EMPTY_BODY = YES; 145 | CLANG_WARN_ENUM_CONVERSION = YES; 146 | CLANG_WARN_INFINITE_RECURSION = YES; 147 | CLANG_WARN_INT_CONVERSION = YES; 148 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 149 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 150 | CLANG_WARN_UNREACHABLE_CODE = YES; 151 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 152 | CODE_SIGN_IDENTITY = "-"; 153 | COPY_PHASE_STRIP = NO; 154 | DEBUG_INFORMATION_FORMAT = dwarf; 155 | ENABLE_STRICT_OBJC_MSGSEND = YES; 156 | ENABLE_TESTABILITY = YES; 157 | GCC_C_LANGUAGE_STANDARD = gnu99; 158 | GCC_DYNAMIC_NO_PIC = NO; 159 | GCC_NO_COMMON_BLOCKS = YES; 160 | GCC_OPTIMIZATION_LEVEL = 0; 161 | GCC_PREPROCESSOR_DEFINITIONS = ( 162 | "DEBUG=1", 163 | "$(inherited)", 164 | ); 165 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 166 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 167 | GCC_WARN_UNDECLARED_SELECTOR = YES; 168 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 169 | GCC_WARN_UNUSED_FUNCTION = YES; 170 | GCC_WARN_UNUSED_VARIABLE = YES; 171 | MACOSX_DEPLOYMENT_TARGET = 10.12; 172 | MTL_ENABLE_DEBUG_INFO = YES; 173 | ONLY_ACTIVE_ARCH = YES; 174 | SDKROOT = macosx; 175 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 176 | }; 177 | name = Debug; 178 | }; 179 | F59739851F04AAF500FAC3D8 /* Release */ = { 180 | isa = XCBuildConfiguration; 181 | buildSettings = { 182 | ALWAYS_SEARCH_USER_PATHS = NO; 183 | CLANG_ANALYZER_NONNULL = YES; 184 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 185 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 186 | CLANG_CXX_LIBRARY = "libc++"; 187 | CLANG_ENABLE_MODULES = YES; 188 | CLANG_ENABLE_OBJC_ARC = YES; 189 | CLANG_WARN_BOOL_CONVERSION = YES; 190 | CLANG_WARN_CONSTANT_CONVERSION = YES; 191 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 192 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 193 | CLANG_WARN_EMPTY_BODY = YES; 194 | CLANG_WARN_ENUM_CONVERSION = YES; 195 | CLANG_WARN_INFINITE_RECURSION = YES; 196 | CLANG_WARN_INT_CONVERSION = YES; 197 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 198 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 199 | CLANG_WARN_UNREACHABLE_CODE = YES; 200 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 201 | CODE_SIGN_IDENTITY = "-"; 202 | COPY_PHASE_STRIP = NO; 203 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 204 | ENABLE_NS_ASSERTIONS = NO; 205 | ENABLE_STRICT_OBJC_MSGSEND = YES; 206 | GCC_C_LANGUAGE_STANDARD = gnu99; 207 | GCC_NO_COMMON_BLOCKS = YES; 208 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 209 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 210 | GCC_WARN_UNDECLARED_SELECTOR = YES; 211 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 212 | GCC_WARN_UNUSED_FUNCTION = YES; 213 | GCC_WARN_UNUSED_VARIABLE = YES; 214 | MACOSX_DEPLOYMENT_TARGET = 10.12; 215 | MTL_ENABLE_DEBUG_INFO = NO; 216 | SDKROOT = macosx; 217 | }; 218 | name = Release; 219 | }; 220 | F59739871F04AAF500FAC3D8 /* Debug */ = { 221 | isa = XCBuildConfiguration; 222 | buildSettings = { 223 | PRODUCT_NAME = "$(TARGET_NAME)"; 224 | SWIFT_VERSION = 3.0; 225 | }; 226 | name = Debug; 227 | }; 228 | F59739881F04AAF500FAC3D8 /* Release */ = { 229 | isa = XCBuildConfiguration; 230 | buildSettings = { 231 | PRODUCT_NAME = "$(TARGET_NAME)"; 232 | SWIFT_VERSION = 3.0; 233 | }; 234 | name = Release; 235 | }; 236 | /* End XCBuildConfiguration section */ 237 | 238 | /* Begin XCConfigurationList section */ 239 | F597397A1F04AAF500FAC3D8 /* Build configuration list for PBXProject "PriyankaAndToys" */ = { 240 | isa = XCConfigurationList; 241 | buildConfigurations = ( 242 | F59739841F04AAF500FAC3D8 /* Debug */, 243 | F59739851F04AAF500FAC3D8 /* Release */, 244 | ); 245 | defaultConfigurationIsVisible = 0; 246 | defaultConfigurationName = Release; 247 | }; 248 | F59739861F04AAF500FAC3D8 /* Build configuration list for PBXNativeTarget "PriyankaAndToys" */ = { 249 | isa = XCConfigurationList; 250 | buildConfigurations = ( 251 | F59739871F04AAF500FAC3D8 /* Debug */, 252 | F59739881F04AAF500FAC3D8 /* Release */, 253 | ); 254 | defaultConfigurationIsVisible = 0; 255 | }; 256 | /* End XCConfigurationList section */ 257 | }; 258 | rootObject = F59739771F04AAF500FAC3D8 /* Project object */; 259 | } 260 | -------------------------------------------------------------------------------- /swift/PriyankaAndToys/PriyankaAndToys.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /swift/PriyankaAndToys/PriyankaAndToys.xcodeproj/xcuserdata/MBKWON.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /swift/PriyankaAndToys/PriyankaAndToys.xcodeproj/xcuserdata/MBKWON.xcuserdatad/xcschemes/PriyankaAndToys.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /swift/PriyankaAndToys/PriyankaAndToys/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // PriyankaAndToys 4 | // 5 | // Created by Moonbeom KWON on 2017. 6. 29.. 6 | // Copyright © 2017년 mbkyle. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | print("Hello, PriyankaAndToys!") 12 | 13 | let numOfDolls = readLine(strippingNewline: true) 14 | let dollArray = readLine(strippingNewline: true)?.components(separatedBy: " ") 15 | 16 | guard let dollCount = numOfDolls, let dollList = dollArray else { 17 | exit(1) 18 | } 19 | 20 | let numbers = dollList.map {Int($0) ?? 0}.sorted() 21 | 22 | 23 | func getResult(nums: [Int], acc: Int) -> Int { 24 | 25 | guard nums.count != 0 else { 26 | return acc 27 | } 28 | 29 | 30 | let maxTuple = nums.enumerated().map {index, _ -> (index: Int, count: Int) in 31 | 32 | return (index: index, count: getCount(nums: Array( nums[index ..< nums.count] ))) 33 | 34 | }.max {a, b in a.count < b.count} 35 | 36 | 37 | if let target = maxTuple { 38 | 39 | var paramNumbers = nums 40 | paramNumbers.removeSubrange(target.index ..< (target.index + target.count)) 41 | 42 | return getResult(nums: paramNumbers, 43 | acc: acc + 1) 44 | 45 | } else { 46 | return acc 47 | } 48 | } 49 | 50 | 51 | func getCount(nums: [Int]) -> Int { 52 | let limit = (nums.first ?? 0) + 4 53 | return nums.prefix(while: { $0 <= limit}).count 54 | } 55 | 56 | 57 | 58 | 59 | print(getResult(nums: numbers, acc: 0)) 60 | --------------------------------------------------------------------------------