본문 바로가기

코딩 테스트/Lv.1

[프로그래머스] 키패드 누르기 with Kotlin

문제

숫자 버튼을 어느쪽 손가락으로 누르는지 배열에 담아 반환하는 문제

 

1 2 3
4 5 6
7 8 9
* 0 #

 

조건

  • 시작할 때 왼손은  *에 오른손은 #에 위치
  • 1, 4, 7은 왼손으로 3, 6, 9 는 오른손으로 가운데 열은 손가락이 더 가까운 쪽으로 누른다.
  • 만일 가운데 열 중 양 손의 거리가 같다면, 왼손잡이는 왼손으로 오른손잡이는 오른손으로 누른다.

 

풀이 과정

1. 키패드를 2차원 배열로 초기화

2. 각 번호의 좌표를 Map에 담는다.

3. 현재 양 손의 위치를 담는 변수 선언

4. 조건에 맞춰 누른 손가락을 담아주면 된다.

 

코드

import kotlin.math.abs
class Solution {
    fun solution(numbers: IntArray, hand: String): String {
        var answer = StringBuilder()
        
        val keyPad = arrayListOf(arrayListOf(1,2,3),
                                 arrayListOf(4,5,6),
                                 arrayListOf(7,8,9),
                                 arrayListOf(-1,0,-2))
        
        val hashMapKeyPad : HashMap<Int, Array<Int>> = hashMapOf(
            Pair(1, arrayOf(0,0)), Pair(2, arrayOf(0,1)), Pair(3, arrayOf(0,2)),
            Pair(4, arrayOf(1,0)), Pair(5, arrayOf(1,1)), Pair(6, arrayOf(1,2)),
            Pair(7, arrayOf(2,0)), Pair(8, arrayOf(2,1)), Pair(9, arrayOf(2,2)),
            Pair(0, arrayOf(3,1))
        )
        
        val leftHand : ArrayList<Int> = arrayListOf(3,0)
        val rightHand : ArrayList<Int> = arrayListOf(3,2)
        
        
        for(i in numbers.indices){
            when(numbers[i]){
                1,4,7 -> { val it = numbers[i]
                    //Left
                    val (x,y) = hashMapKeyPad.get(it)!!
                    
                    leftHand.run{
                        clear() 
                        add(x)
                        add(y)
                    }
                    answer.append("L")
                }
                3,6,9 -> { val it = numbers[i]
                    //Right
                    val (x,y) = hashMapKeyPad.get(it)!!
                    
                    rightHand.run{
                        clear() 
                        add(x)
                        add(y)
                    }
                    answer.append("R")
                    
                }
                //가운데 열
                else -> { val it = numbers[i]
                    val (x,y) = hashMapKeyPad.get(it)!!
                    
                    val (rhx, rhy) = rightHand
                    val (lhx, lhy) = leftHand
                    if(abs(rhx-x)+abs(rhy-y) > abs(lhx-x)+abs(lhy-y)){
                        // 왼손이 더 가까움
                        leftHand.run{
                            clear() 
                            add(x)
                            add(y)
                        }
                        answer.append("L")
                    }
                    else if(abs(rhx-x)+abs(rhy-y) < abs(lhx-x)+abs(lhy-y)){
                        //오른손이 더 가까움
                        rightHand.run{
                            clear() 
                            add(x)
                            add(y)
                        }
                        answer.append("R")
                    }
                    else{
                        //동일 거리
                        if(hand == "right") {
                            rightHand.run{
                                clear() 
                                add(x)
                                add(y)
                            }
                            answer.append("R")
                        }
                        else {
                            leftHand.run{
                                clear() 
                                add(x)
                                add(y)
                            }
                            answer.append("L")
                        }
                    }
                }
            }
        }
        return answer.toString()
    }
}