본문 바로가기
Kotlin/Exercise

스크래블 스코어 - 주어진 단어에대하여 점수 계산하기

by 봄석 2019. 3. 17.


스크래블 스코어 - 주어진 단어에대하여 점수 계산하기



문자의 값

Letter                           Value
A, E, I, O, U, L, N, R, S, T       1
D, G                               2
B, C, M, P                         3
F, H, V, W, Y                      4
K                                  5
J, X                               8
Q, Z                               10


ex) cabbage (양배추) 는  14점의 가치를 가집니다 .

-  c 3점 ,a *2 2점, b *2 6점, g 2점 , e 1점



TestCode

@RunWith(Parameterized::class)
class ScrabbleScoreTest(val input: String, val expectedOutput: Int) {
 
    companion object {
        @JvmStatic
        @Parameterized.Parameters(name = "{index}: scoreWord({0})={1}")
        fun data() = listOf(
            arrayOf("a"1),
            arrayOf("A"1),
            arrayOf("f"4),
            arrayOf("at"2),
            arrayOf("zoo"12),
            arrayOf("street"6),
            arrayOf("quirky"22),
            arrayOf("OxyphenButazone"41),
            arrayOf("pinata"8),
            arrayOf(""0),
            arrayOf("abcdefghijklmnopqrstuvwxyz"87)
        )
    }
 
    @Test
    fun test() {
        assertEquals(expectedOutput, ScrabbleScore.scoreWord(input))
    }


해결안 1) 배열중복체크하기 

object ScrabbleScore {
 
        val point1 = listOf("A""E""I""U""O""L""N""R""S""T")
        val point2 = listOf("D""G")
        val point3 = listOf("B""C""M""P")
        val point4 = listOf("F""H""V""W""Y")
        val point5 = listOf("K")
        val point8 = listOf("J""X")
        val point10 = listOf("Q""Z")
 
        fun scoreWord(input: String): Int {
            var point = 0
            input.map {
                it.toUpperCase()
            }.map {
                if (point1.contains(it.toString()))
                    point += 1
                if (point2.contains(it.toString()))
                    point += 2
                if (point3.contains(it.toString()))
                    point += 3
                if (point4.contains(it.toString()))
                    point += 4
                if (point5.contains(it.toString()))
                    point += 5
                if (point8.contains(it.toString()))
                    point += 8
                if (point10.contains(it.toString()))
                    point += 10
            }
            return point
        }


포인트별 배열을 선언해놓고 , array.contains로 내용이 있을경우 포인트를 추가한다 .



해결안 2) sumBy{} 함수 , when

object ScrabbleScore {
        fun scoreWord(input:String)=
            input.toUpperCase()
                .sumBy {
                    when(it){
                        in "DG" -> 2
                        in "BCMP" -> 3
                        in "FHVWY" -> 4
                        'K' -> 5
                        in "JX" -> 8
                        in "QZ" -> 10
                        else -> 1
                    }
                }
    }


1) 들어온 input String을 toUpperCase() 로 대문자로 변경 

2) sumBy{}함수와 when함수를 이용. 


sumBy함수    - https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sum-by.html

공유지
JVM
JS
원주민
inline fun <T> Array<out T>.sumBy(selector: (T) -> Int)Int
inline fun ByteArray.sumBy(selector: (Byte) -> Int)Int
inline fun ShortArray.sumBy(selector: (Short) -> Int)Int
inline fun IntArray.sumBy(selector: (Int) -> Int)Int
inline fun LongArray.sumBy(selector: (Long) -> Int)Int
inline fun FloatArray.sumBy(selector: (Float) -> Int)Int
inline fun DoubleArray.sumBy(selector: (Double) -> Int)Int
inline fun BooleanArray.sumBy(
    selector: (Boolean) -> Int
)Int
inline fun CharArray.sumBy(selector: (Char) -> Int)Int

배열의 각 요소에 적용된 selector 함수에 의해 생성 된 모든 값의 합계를 반환합니다 .

배열의 각요소에서 선택된 함수의 합계를 구하기위해 , sumBy 함수 안에서 it ( 각 char index) 를 이용하여 

when 함수안으로 넣어 정수값을 구한다 . 

정수값은 최종적으로 sumBy{} 함수를 통해서 합쳐져서 나오게된다.


댓글