알고리즘을 푸는 언어를 c++ 에서 swift 언어로 갈아타려고 풀어본 첫 번째 문제.

난이도가 1이었지만 구현을 못함.... 카카오 코테 짜증남 ㅋㅋ

아무튼 원리는 이렇다.

 

키패드가 

1 2 3

4 5 6

7 8 9 

* 0 #

이렇게 돼 있는데 이것을 배열의 인덱스로 바꾸는 것.

예를 들어 숫자 0이 들어왔다면 배열의 [0]번이 되게끔 만들면 됨.

그러면 abs(현재 위치.x 좌표 - 타겟 위치.x 좌표) + abs(현재 위치.y좌표 - 타겟 위치.y 좌표) 

는 곧 거리가 됨.

 

여기까지만 알았다면 이제 구현만 남음.

1, 3, 7 번이랑 3, 6, 9번은 어차피 L, R로 정해져 있으니 위치만 저장해주고,

나머지 2,5,8,0번에 대해 거리를 비교하여 L인지 R인지를 결정해주고, 

거리가 같다면 hand에 따라 L, R을 결정해주면 됨.

L과 R 둘 다 결정과 동시에 손가락 위치를 저장해줘야 함.

 

아래는 정답 코드:

 

 

import Foundation

func isRight(_ number: Int) -> Bool {
    return (number == 3 || number == 6 || number == 9)
}

func isLeft(_ number: Int) -> Bool {
    return (number == 1 || number == 4 || number == 7)
}

func solution(_ numbers:[Int], _ hand:String) -> String {
    var L = (3, 0)
    var R = (3, 2)
    var answer: String = ""
    
    let pos: [(Int, Int)] = [(3, 1), // 0
               (0, 0), (0, 1), (0, 2), // 1, 2, 3
              (1, 0), (1, 1), (1, 2), // 4, 5, 6
              (2, 0), (2, 1), (2, 2), // 7, 8, 9
              (3, 0), (3, 2)] // *, #

    
    numbers.forEach { number in
                     
        let target = pos[number]
                     
        if (isLeft(number)) {
            L = target
            answer += "L"
        } else if (isRight(number)) {
            R = target
            answer += "R"
        } else {
            let leftDistance = abs(target.0 - L.0) + abs(target.1 - L.1)
            let rightDistance = abs(target.0 - R.0) + abs(target.1 - R.1)
            if (leftDistance < rightDistance) {
                L = target
                answer += "L"
            } else if (rightDistance < leftDistance) {
                R = target
                answer += "R"
            } else {
                if hand == "right" {
                    answer += "R"
                    R = target
                } else {
                    answer += "L"
                    L = target
                }
            }
        }
    }
    return answer
}

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom