코틀린 입문 스터디 (6) 실습 : Mastermind game

mook2_y2
4 min readFeb 19, 2019

--

스터디파이 코틀린 입문 스터디 (https://studypie.co/ko/course/kotlin_beginner) 관련 자료입니다.

코틀린 입문반은 Kotlin을 직접 개발한 개발자가 진행하는 Coursera 강좌인 “Kotlin for Java Developers” (https://www.coursera.org/learn/kotlin-for-java-developers) 를 기반으로 진행되며 아래는 본 강좌 요약 및 관련 추가 자료 정리입니다.

목차

(1) Introduction

(2) From Java to Kotlin

(3) Basics

(4) Control Structures

(5) Extensions

(6) 실습 : Mastermind game

(7) Nullability

(8) Functional Programming

(9) 실습 : Mastermind in a functional style, Nice String, Taxi Park

(10) Properties

(11) Object-oriented Programming

(12) Conventions

(13) 실습 : Rationals, Board

(14) Inline functions

(15) Sequences

(16) Lambda with Receiver

(17) Types

(18) 실습 : Game 2048 & Game of Fifteen

1. 문제 설명

  • 6개 서로 다른 색상(A~F)의 공에서 4개를 뽑습니다. 순서도 존재합니다. (ex: AAAA, ABFD)
  • 상대측이 guess를 하면 문제를 낸 사람은 각 위치에 문자가 맞는지 확인하여 위치가 맞은 것 개수(rightPosition)와, 위치가 틀린 것 개수 (wrongPosition)를 알려줍니다.
  • 한편 guess에 동일한 문자를 여러개 넣은 경우, 그게 secret과 개수가 동일하면 wrongPosition 으로 카운트 하고, 맞지 많으면 아예 카운트하지 않습니다.

2. 예시 답안

  • test > mastermind > MastermindTest.kt 파일에서 Run Test 실행을 통해 정답여부를 확인하실 수 있습니다.
fun evaluateGuess(secret: String, guess: String): Evaluation {
// 0으로 초기화하므로 타입 추론을 통해 타입 명시 생략 (간결성 개선)
var (rightPosition, wrongPosition) = 0 to 0
// 재할당하지 않으므로 val 키워드로 선언
val guessHashMap: HashMap<Char, Int> = HashMap()
val secretHashMap: HashMap<Char, Int> = HashMap()

for (s in secret){
when(s){
!in secretHashMap.keys -> secretHashMap[s] = 1
else -> secretHashMap[s] = secretHashMap[s]!!.plus(1)
}
}

for (g in guess){
when(g){
!in guessHashMap.keys -> guessHashMap[g] = 1
else -> guessHashMap[g] = guessHashMap[g]!!.plus(1)
}
}

for ((index, g) in guess.withIndex()){
// when expression 사용
when{
g.compareTo(secret[index]) == 0 -> rightPosition += 1
g in secretHashMap.keys && secretHashMap[g] == guessHashMap[g] -> {
wrongPosition += 1
}
}
}

return Evaluation(rightPosition, wrongPosition)
}
  • 한편 이 문제는 추후 (8) Functional Programming 파트를 공부한 이후 collection operation을 통해 훨씬 간결한 문법으로 해결할 수 있습니다. ((9) 실습 : Mastermind in a functional style, Nice String, Taxi Park 파트에서 다룰 예정)
  • 추가적으로 IntelliJ로 코딩하시면서 Kotlin 권장 코딩 스타일을 적용하는 방법에 대해 IntelliJ Kotlin Code Style 설정법를 참고 부탁드립니다.

--

--