[프로그래머스] 키패드 누르기
👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

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

728x90
반응형

programmers.co.kr/learn/courses/30/lessons/67256?language=swift

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

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

 

키패드를 왼손/오른손으로 누를지 경우에 따라 분류해주면 되는 문제. 

키패드를 좌표로 보고 현재 왼손, 오른손 위치와 누르고자 하는 버튼의 좌표 거리를 비교하여 누를 수 있도록 했다. 

그리 어려운 문제는 아니기에 바로 코드로 가보자!

 

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    // numbers를 queue처럼 쓰고자 변수 선언
    var numbers = numbers
    // 키패드 값 입력
    let N = [["1","4","7","*"],["2","5","8","0"], ["3","6","9","#"]]
    // 키패드 값 : 좌표값을 담을 딕셔너리 객체 생성
    var Ndict = [String:[Int]]()
    
    // 각 값에 좌표값 설정
    for (i,n) in N.enumerated() {
        for (j,v) in n.enumerated() {
            Ndict[v] = [i,j]
        }
    }
    
    var answer = ""
    // 현 위치 설정
    var leftHand = "*"
    var rightHand = "#"
    
    // 하나씩 빼면서 빈 값일 때 까지 
    while !numbers.isEmpty {
        // 값과 좌표를 뽑고
        var value = String(numbers.removeFirst())
        var value_loc = Ndict[value]!
        
        // 1번째줄일 경우 거리 상관없이 무조건 "왼손"으로 
        if N[0].contains(value) {
            answer.append("L")
            leftHand = value
        // 3번째줄일 경우 거리 상관없이 무조건 "왼손"으로            
        } else if N[2].contains(value) {
            answer.append("R")
            rightHand = value
        // 2번째줄일 경우에만 거리로 판단 (다만 거리가 같을 경우 손잡이에 따라 판단)
        } else {
            var l_v = abs(Ndict[leftHand]![0] - value_loc[0]) + abs(Ndict[leftHand]![1] - value_loc[1])
            var r_v = abs(Ndict[rightHand]![0] - value_loc[0]) + abs(Ndict[rightHand]![1] - value_loc[1])
            // 거리 비교 (작은 값의 손을 선택)            
            if l_v < r_v {
                leftHand = value
                answer.append("L")
            } else if l_v > r_v {
                rightHand = value
                answer.append("R")
            } else { 
                // 거리가 같을 경우 손잡이에 따라 결정
                if hand == "right" {
                    answer.append("R")
                    rightHand = value
                } else { 
                    answer.append("L")
                    leftHand = value
                }
                
            }
        }
    }
    return answer
}

 

[ 프로세스 ] 

(*모든 경우 누르면 해당 손의 좌표를 누른 번호의 좌표로 변경)

 

1. (키패드 값 : 좌표)로 구성된 딕셔너리 객체 생성

2. 왼손, 오른손의 현 위치 설정 

3. 룰에 따라 1열,3열은 왼손,오른손으로 누르도록

4. 2열의 경우 거리에 따라 선택하도록 

  4-1. 거리가 같을 경우 손잡이에 따라 선택하도록

5. 결과값 리턴 

 

 

각각의 케이스들만 잘 따져서 규칙에 맞게 구현한다면 쉽게 해결될 수 있는 문제. 

728x90
반응형