스크래블 스코어 - 주어진 단어에대하여 점수 계산하기
문자의 값
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
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{} 함수를 통해서 합쳐져서 나오게된다.
'Kotlin > Exercise' 카테고리의 다른 글
비밀 악수 - 10진수와 2진수 (4) | 2019.03.20 |
---|---|
정사각형의 차이 (4) | 2019.03.17 |
어구를 약어로 변경하기 (2) | 2019.03.14 |
스트링 뒤집기 (2) | 2019.03.13 |
우주 시대 - 행나이를 주었을때, 나이를 초로 바꾸어보기 (2) | 2019.03.09 |
댓글