자료구조와 알고리즘/알고리즘

[Swift] [프로그래머스 1단계] 키패드 누르기

jaewpark 2022. 8. 6. 21:39

문제

 

프로그래머스

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

programmers.co.kr

 

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    var ret:String = ""
    // 키패드를 2차원 배열로 생각하고, 숫자 0의 좌표
    var datas:[[Int]] = [[3, 1]]
    // 키패드 *
    var leftHand: [Int] = [3, 0]
    // 키패드 #
    var rightHand: [Int] = [3, 2]
    // 키패드 숫자별로 좌표
    for i in 1...9 {
        datas.append([(i - 1) / 3, (i - 1) % 3])
    }
    
    // 거리 계산
    func distance(_ N: inout [Int], _ L: inout [Int], _ R: inout [Int]) -> String {
        let leftD:Int = abs(N[0] - L[0]) + abs(N[1] - L[1])
        let rightD:Int = abs(N[0] - R[0]) + abs(N[1] - R[1])
        if leftD == rightD && hand == "right" {
            R = N
            return "R"
        } else if leftD == rightD && hand == "left" {
            L = N
            return "L"
        } else if leftD > rightD {
            R = N
            return "R"
        }
        L = N
        return "L"
    }
    
    // 문제에서 주어진 번호 하나하나 확인
    for number in numbers {
        if number % 3 == 1 {
            leftHand = datas[number]
            ret += "L"
        } else if number != 0 && number % 3 == 0 {
            rightHand = datas[number]
            ret += "R"
        } else {
            ret += distance(&datas[number], &leftHand, &rightHand)
        } 
    }
    return ret
}
  0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
3 * 0 #

키패드의 숫자 0은 좌표 [3, 1]을 가지고 있습니다.

숫자 6은 [1, 2]의 좌표를 가지고 있다고 생각을 했습니다.

이러한 데이터를 [[Int]]의 형태로 만들어 줍니다.

 

왼손은 *, 오른손은 #에서 시작을 합니다.

 

이제 문제에서 주어진 배열의 숫자들이 변하면서 왼손 혹은 오른손이 움직이는 건지 확인을 할텐데,

주어진 숫자와 왼손, 오른손의 거리를 각각 비교를 합니다.

왼손이 더 가깝다면 왼손은 위치를 변경하고, 오른손이 더 가깝다면 오른손의 위치를 변경합니다.

그리고 반환값에 움직인 손을 넣어줍니다.

 

그리고 1, 4, 7 이라면 왼손이 움직이고 3, 6, 9일 때는 오른손이 움직입니다

위에서 비교를 할 때에는 거리가 같다면 왼손잡이라면 왼손이 움직이며, 오른손이라면 오른손이 움직이면 됩니다