[백준] 문자메시지 (2037)(kotlin)

문제 설명

백준 2037번 문제 링크

입력 및 출력

» 입력

첫째 줄에 p와 w가 주어진다. (1 ≤ p, w ≤ 1,000) p는 버튼을 한번 누르는데 걸리는 시간이고, w는 AC와 같은, 같은 숫자인 문자를 연속으로 찍기 위해 기다리는 시간을 의미한다. 그리고 둘째 줄에는 적을 문자열이 주어진다. 단, 이 문자열의 길이는 1000보다 작고, 맨 앞과 맨 뒤에 공백이 들어오는 경우는 없다고 가정하여도 좋다. 문자열은 알파벳 대문자와 띄어쓰기만으로 이루어져 있다.

» 출력

첫째 줄에 메시지를 적는데 걸리는 시간을 출력한다.

예제 입출력(테스트케이스)

입력 출력
2 10
ABBAS SALAM
72

문제 풀이1

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val (p, w) = readLine().split(" ").map { it.toInt() }
    val sentence = readLine()

    var prev = ' '
    var time = 0

    sentence.forEach { current ->
        time += if (wait(current, prev))  w + buttonCount(current) * p else buttonCount(current) * p
        prev = current
    }

    println(time)
}

fun wait(ch: Char, prev: Char): Boolean {
    return when {
        ch in 'A'..'C' && prev in 'A'..'C' -> true
        ch in 'D'..'F' && prev in 'D'..'F' -> true
        ch in 'G'..'I' && prev in 'G'..'I' -> true
        ch in 'J'..'L' && prev in 'J'..'L' -> true
        ch in 'M'..'O' && prev in 'M'..'O' -> true
        ch in 'P'..'S' && prev in 'P'..'S' -> true
        ch in 'T'..'V' && prev in 'T'..'V' -> true
        ch in 'W'..'Z' && prev in 'W'..'Z' -> true
        else -> false
    }
}

fun buttonCount(ch: Char): Int {
    return when (ch) {
        'A', 'D', 'G', 'J', 'M', 'P', 'T', 'W', ' ' -> 1
        'B', 'E', 'H', 'K', 'N', 'Q', 'U', 'X' -> 2
        'C', 'F', 'I', 'L', 'O', 'R', 'V', 'Y' -> 3
        else -> 4
    }
}

//(1 * 2) + (2 * 2 + 10) + (2 * 2 + 10) + (1 * 2 + 10) + (4 * 2) + (1 * 2) + (3 * 2) + (1 * 2) + (3 * 2) + (1 * 3) + (1 * 2)