[BOJ 실버4] ZOAC 3 Kotlin

문제

풀이

  • 자칫하면 풀이가 엄청 길어질 수 있는 문제인데 최대한 깔끔하게 짜려고 노력했다. 각 문자별로 좌표를 다 저장하면 코드가 너무 지저분해질거 같아 우선 자음 모음 Array를 별도로 생성하고 Map에 Key로 문자, Value로 좌표(Pair)를 저장하여 풀이 하였다.

  • 각 문자가 자음인지 모음인지 판단하고 계산하고 문자를 누르는 시간 1을 추가하는 것을 반복하여 풀이

  • 이런 구현문제를 중점적으로 해야할 것 같다. 특히 채점 결과가 안나오는 코테에서 히든테케에서 자주 걸리는거 같다

코드

import java.lang.Math.abs

val consonant = charArrayOf('q','w','e','r','t','a','s','d','f','g','z','x','c','v')
val vowel = charArrayOf('y','u','i','o','p','h','j','k','l','b','n','m')
val map = HashMap<Char,Pair<Int,Int>>()
fun main() = with(System.`in`.bufferedReader()){
    var a =0
    var b =0
    for(t in consonant){
        map.put(t,Pair(a,b++))
        if(t=='t'||t=='g'){
            a++
            b=0
        }
    }
    a = 0
    b = 5
    for(t in vowel){
        map.put(t,Pair(a,b++))
        if(t=='p'){
            a++
            b=5
        }
        if(t=='l'){
            a++
            b=4
        }
    }
    var (curLeft,curRight) = readLine().split(" ").map{it[0]}
    val s = readLine()
    var ans=0
    for(t in s){
        if(consonant.contains(t)){
            ans += (getDistance(t,curLeft)+1)
            curLeft = t
        }
        else{
            ans += (getDistance(t,curRight)+1)
            curRight = t
        }
    }
    println(ans)
}

fun getDistance(a : Char, b: Char) : Int{
    val pointA = map[a]
    val pointB = map[b]
    return abs(pointA!!.first-pointB!!.first)+abs(pointA!!.second-pointB!!.second)
}

좋은 웹페이지 즐겨찾기