[백준] 문자메시지 (2037)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에 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)