프로그래머스

[카카오 인턴] 키패드 누르기

끝까지 처음처럼 2022. 9. 9. 20:26
728x90
import kotlin.math.*
class Solution {
    fun solution(numbers: IntArray, hand: String): String {
        var answer = ""
        val pinger = hand[0].toString().toUpperCase()
        val keyPad = arrayOf(arrayOf(0,0),arrayOf(0,1),arrayOf(0,2),
            arrayOf(1,0),arrayOf(1,1),arrayOf(1,2),
            arrayOf(2,0),arrayOf(2,1),arrayOf(2,2),
                         arrayOf(3,1)) // 키패드 모양과 동일하게.....ㅎ
        var startLeft = mutableListOf(3,0)
        var startRight  = mutableListOf(3,2)

        for(i in 0 .. numbers.size-1){

            when(numbers[i]){
                1,4,7 -> {
                    answer += "L"
                    startLeft[0] = keyPad[numbers[i]-1][0]
                    startLeft[1] = keyPad[numbers[i]-1][1]
                }
                3,6,9 -> {
                    answer += "R"
                    startRight[0] = keyPad[numbers[i]-1][0]
                    startRight[1] = keyPad[numbers[i]-1][1]
                }
                2,5,8 -> {
                    var temp1 = keyPad[numbers[i]-1] // 누르려는 버튼위치
                    val temp2 = abs(temp1[0]-startRight[0]) + abs(temp1[1]-startRight[1])
                    val temp3 = abs(temp1[0]-startLeft[0]) + abs(temp1[1]-startLeft[1])

                    val btnRightLen =  temp2
                    val btnLeftLen  =  temp3

                    if(btnRightLen < btnLeftLen){
                        answer += "R"
                        startRight[0] = keyPad[numbers[i]-1][0]
                        startRight[1] = keyPad[numbers[i]-1][1]
                    }
                    if(btnRightLen > btnLeftLen){
                        answer += "L"
                        startLeft[0] = keyPad[numbers[i]-1][0]
                        startLeft[1] = keyPad[numbers[i]-1][1]
                    }
                    if(btnRightLen == btnLeftLen){
                        answer += pinger
                        if(pinger == "R"){
                            startRight[0] = keyPad[numbers[i]-1][0]
                            startRight[1] = keyPad[numbers[i]-1][1]
                        }else{
                            startLeft[0] = keyPad[numbers[i]-1][0]
                            startLeft[1] = keyPad[numbers[i]-1][1]
                        }
                    }
                }

                0 -> {
                    var temp1 = keyPad[9] // 누르려는 버튼위치
                    val temp2 = abs(temp1[0]-startRight[0]) + abs(temp1[1]-startRight[1])
                    val temp3 = abs(temp1[0]-startLeft[0]) + abs(temp1[1]-startLeft[1])
                    val btnRightLen =  temp2
                    val btnLeftLen  =  temp3
                    if(btnRightLen < btnLeftLen){
                        answer += "R"
                        startRight[0] = keyPad[9][0]
                        startRight[1] = keyPad[9][1]
                    }
                    if(btnRightLen > btnLeftLen){
                        answer += "L"
                        startLeft[0] = keyPad[9][0]
                        startLeft[1] = keyPad[9][1]
                    }
                    if(btnRightLen == btnLeftLen){
                        answer += pinger
                        if(pinger == "R"){
                            startRight[0] = keyPad[9][0]
                            startRight[1] = keyPad[9][1]
                        }else{
                            startLeft[0] = keyPad[9][0]
                            startLeft[1] = keyPad[9][1]
                        }
                    }
                }
            }
        }
        return answer
    }
}

저의 현재 실력으로 푼 문제 답안이며, 가장 좋은 코드는 아닐 수 있으며, 코틀린을 공부하면서 추가적으로 알게 된 개념이 있어 다시 풀 경우 추가적으로 코드를 작성 할 수 있도록 하겠습니다.