나의 기록, 현진록

[Swift] 프로그래머스 2020 카카오 인턴십 > 키패드 누르기 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 2020 카카오 인턴십 > 키패드 누르기

guswlsdk 2022. 7. 7. 09:50
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1. 키패드에서는 10(0~9)개의 숫자만 표현하기 때문에 딕셔너리로 숫자마다 좌표를 정의했다. 

2. numbers의 각 요소가 1, 4, 7에 해당하는 경우는 왼손이며, 왼손의 현재 위치를 수정하고, 3, 6, 9에 해당하는 경우 오른손이며, 오른손의 현재 위치를 수정한다.

3. numbers의 각 요소가 2, 5, 8 ,0에 해당하는 경우 왼손의 위치와 오른손의 위치를 숫자와의 위치와 비교하여 거리를 구한다. 이 때 거리는 |(x1 - x2)|  + |(y1 - y2)|이다.

4. 만약 왼손으로부터의 거리와 오른손으로부터의 거리가 같을 경우 처음에 주어진 hand 매개변수에 따른다.

 

 

 

코드

func solution(_ numbers:[Int], _ hand:String) -> String {
    var curL = (1,4)
    var curR = (3,4)
    let left = [1,4,7]
    let right = [3,6,9]
    let numDict = [1:(1,1), 2: (2,1), 3: (3,1), 4: (1,2), 5:(2,2), 6:(3,2), 7:(1,3), 8:(2,3), 9: (3,3), 0:(2,4)]
    var result = ""
    for i in numbers{
        if left.contains(i){
            curL = numDict[i]!
            result += "L"
        }else if right.contains(i){
            curR = numDict[i]!
            result += "R"
        }else{
            let returnHand = disMin(curL: curL, curR: curR, cur: numDict[i]!)
            if returnHand == "L"{
                curL = numDict[i]!
                result += "L"
            }else if returnHand == "R"{
                curR = numDict[i]!
                result += "R"
            }else{
                if hand == "left"{
                    curL = numDict[i]!
                    result += "L"
                }else{
                    curR = numDict[i]!
                    result += "R"
                }
            }
        }
    }
    return result
}

func disMin(curL: (Int, Int), curR: (Int, Int), cur: (Int, Int)) -> String{
    let disL = abs(cur.0 - curL.0) +  abs(cur.1 - curL.1)
    let disR = abs(cur.0 - curR.0) + abs(cur.1 - curR.1)
    if disL > disR{
        return "R"
    }else if disL < disR{
        return "L"
    }else{
        return "="
    }
}

 

 

반응형