Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Algorithm] 키패드 누르기 #6

Closed
2 tasks done
hwangJi-dev opened this issue Aug 1, 2022 · 0 comments
Closed
2 tasks done

[Algorithm] 키패드 누르기 #6

hwangJi-dev opened this issue Aug 1, 2022 · 0 comments

Comments

@hwangJi-dev
Copy link
Owner

hwangJi-dev commented Aug 1, 2022

📌 TODO

  • 문제풀이
  • 정리

키패드 누르기

💬 Idea

  • 키패드의 왼쪽에 해당하는 1, 4, 7을 누를 때는 leftPress()함수를 사용하여 사용한 손 String에 “L”을 추가하고, 현재 왼손의 위치를 해당 키패드로 바꿔주었다. (오른쪽 3, 6, 9를 누를 때는 rightPress()함수 사용)
  • 키패드의 가운데에 해당하는 2, 5, 8, 0을 누를 때는 양손 모두 사용될 가능성이 있기 때문에 누르려는 키패드의 위치와 왼쪽, 오른쪽 손의 현재 위치 사이의 간격을 구해 가까운 손을 구하는 식이 필요했다.
    • 키패드를 3x3의 좌표계로 생각하여 키패드별 고유 좌표를 구해주었다. (calPosition함수)
    • 누르려는 키패드의 위치와 현재 손의 위치를 통해 거리를 계산해주는 함수를 통해 (calDistance 함수)
      왼쪽, 오른쪽의 거리를 계산한 후 거리가 더 짧은 손으로 키패드를 누를 수 있도록 구현하였다.

💬 풀이

var useHandsString: String = ""
var currentLPosition: String = "*"
var currentRPosition: String = "#"

func solution(_ numbers:[Int], _ hand:String) -> String {
    for i in numbers {
        switch i {
        case 1, 4, 7:
            leftPress(num: i)
        case 2, 5, 8, 0:
            let distanceByLeft = calDistance(num: i, currentPosition: currentLPosition)
            let distanceByRight = calDistance(num: i, currentPosition: currentRPosition)
            
            if distanceByLeft == distanceByRight {
                if hand == "left" {
                    leftPress(num: i)
                } else {
                    rightPress(num: i)
                }
            } else if distanceByLeft > distanceByRight {
                rightPress(num: i)
            } else {
                leftPress(num: i)
            }
        case 3, 6, 9:
            rightPress(num: i)
        default:
            print("default")
        }
    }
    
    return useHandsString
}

func leftPress(num: Int) {
    useHandsString += "L"
    currentLPosition = String(describing: num)
}

func rightPress(num: Int) {
    useHandsString += "R"
    currentRPosition = String(describing: num)
}

func calDistance(num: Int, currentPosition: String) -> Int {
    var numLocation: [Int] = []
    var currentLocation: [Int] = []
    
    if num == 0 {
        numLocation = [3, 1]
    } else {
        numLocation = calPosition(num: num)
    }
    
    if currentPosition == "*" {
        currentLocation = [3, 0]
    } else if currentPosition == "#" {
        currentLocation = [3, 2]
    } else {
        currentLocation = calPosition(num: Int(currentPosition)!)
    }
    
    return abs(numLocation[0] - currentLocation[0]) + abs(numLocation[1] - currentLocation[1])
}

func calPosition(num: Int) -> [Int] {
    if num == 0 {
        return [3, 1]
    } else {
        return [(num - 1) / 3, ((num - 1) % 3)]
    }
}

소요시간 : 40분


💬 알게된 문법

✅ abs

  • swift에서 절댓값을 반환할 수 있는 함수

  • 주어진 숫자의 절대값을 반환

  • x의 절대값은 같은 형식으로 표현할 수 있어야 한다. 특히, 부호 있는 고정 너비 정수형의 최소값의 절대값은 표현할 수 없다.

    let x = Int8.min
    // x == -128
    let y = abs(x)
    // Overflow error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant