티스토리 뷰

728x90

 

https://programmers.co.kr/learn/courses/30/lessons/67256

 

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

[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

 

 

내 풀이

머리를 굴려봤지만 포기..

로.직.폭.망

로직보기

더보기
func solution(_ numbers:[Int], _ hand:String) -> String {
    var lhs = -1
    var rhs = -2
    var lhsDistance = 0
    var rhsDistance = 0
    var leftNumbers = [1, 4, 7]
    var rightNumbers = [3, 6, 9]
    var pressHand: [String] = []
    
    for num in numbers {
        switch lhs ==  {
        case num == 0:
            lhsDistance = 1
        case num == 8:
            lhsDistance = 2
        case num == 5:
            lhsDistance = 3
        case num == 2:
            lhsDistance = 4
        }

        switch rhs == "#" {
        case num == 0:
            rhsDistance = 1
        case num == 8:
            rhsDistance = 2
        case num == 5:
            rhsDistance = 3
        case num == 2:
            rhsDistance = 4
        }

        if lhs + 1 == num {
            lhsDistance = 1
        } else if lhs + 4 == num {
            lhsDistance = 2
        } else if lhs + 7 == num {
            lhsDistance = 3
        } else if lhs + 9 == num {
            lhsDistance = 4
        } else if lhs - 2 == num {
            lhsDistance = 2
        } else if lhs + 6 == num {
            lhsDistance = 3
        } else if lhs - 5 == num {
            lhsDistance = 3
        } else if lhs - 7 == num {
            lhsDistance = 2
        }

        if rhs - 1 == num {
            rhsDistance = 1
        } else if rhs + 2 == num {
            rhsDistance = 2
        } else if rhs + 5 == num {
            rhsDistance = 3
        } else if rhs + 7 == num {
            rhsDistance = 4
        } else if rhs - 4 == num {
            rhsDistance = 2
        } else if rhs == 6 && num == 0 {
            rhsDistance = 3
        } else if rhs - 7 == num {
            rhsDistance = 3
        } else if rhs == 9 && num == 0 {
            rhsDistance == 1
        }

        if lhsDistance > rhsDistance {
            pressHand.append("L")
            lhs = num
        } else if rhsDistance > lhsDistance {
            pressHand.append("R")
            rhs = num
        } else if lhsDistance == rhsDistance && hand == "left" {
            pressHand.append("L")
            lhs = num
        } else {
            pressHand.append("R")
            rhs = num
        }
        
        if leftNumbers.contains(num) {
            pressHand.append("L")
        } else if rightNumbers.contains(num) {
            pressHand.append("R")
        }
    }
    print(pressHand)
    
    
    return ""
}

solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right")

 

 

 

다른사람의 풀이

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    enum KeypadHand {
        case left
        case right
    }
    
    var result = ""
    var leftHand = 10
    var rightHand = 12
    
    for i in numbers {
        let number = i == 0 ? 11 : i
        var tapHand: KeypadHand = .left
        
        switch number {
        case 1, 4, 7:
            tapHand = .left
            
        case 3, 6, 9:
            tapHand = .right
            
        case 2, 5 ,8, 11:
            let leftTemp = abs(number - leftHand)
            let rightTemp = abs(number - rightHand)
            
            let leftDistance = (leftTemp / 3) + (leftTemp % 3)
            let rightDistance = (rightTemp / 3) + (rightTemp % 3)
            
            if leftDistance == rightDistance {
                tapHand = hand == "left" ? .left : .right
            } else {
                tapHand = leftDistance < rightDistance ? .left : .right
            }
            
        default:
            break
        }
        if tapHand == .left {
            result.append("L")
            leftHand = number
        } else {
            result.append("R")
            rightHand = number
        }
    }
    return result
}

이번엔 메소드를 배운것 보다 로직을 배운게 좋았다.

문제 풀이를 정리해 보자면 

사용자가 키패드를 누를때 왼손으로는 1, 4 ,7오른손으로는 3, 6, 9를 무조건 누르게 되고,

가운데 있는 2, 5, 8, 0은 손의 거리가 가장 가까운 손으로 눌러야 하며,

둘다 거리가 같다면 왼손잡이인지 오른손잡이인지를 보고 해당손잡이의 손으로 누르는 방식을 구현을 해야한다.

 

해당거리를 구하는게 어려웠는데 위의 풀이는 이렇다.

 

더보기

키패드의 숫자들을 살펴보면

좌우에 있는 숫자들끼리는 +1, -1씩 차이가 난다. 예) 4, 5, 6

상하에 있는 숫자들끼리는 +3, -3씩 차이가 난다. 예) 1, 4, 7

현재 손이 있는 곳과 다음 눌러야 하는 숫자의 차이를 3으로 나누어 그 몫과 나머지를 더하면 해당 거리를 구할 수 있다.

 

예를 들어 살펴보자

 

왼손 위치 오른손 위치 눌러야 할 숫자
1 9 8


왼손 위치(1) - 눌러야 할 숫자(8) = 7 (차이를 구하는 것이므로 절대값으로 계산한다)
왼손 위치와 눌러야 할 숫자의 차이(7) / 3 = 2...1
몫이 2이고 나머지가 1이므로 두 숫자를 더한 3이 키패드 1과 8의 거리값이 된다

 

오른손 위치(9) - 눌러야 할 숫자(8) = 1
1/ 3 = 0...1
몫이 0이고 나머지가 1이므로 두 숫자를 더한 1이 키패드 9와 8의 거리값이 된다

 

이런식으로 계산할 경우 

키패드 숫자 중 *, 0, # 은 아래처럼 숫자로 변환후 계산해야 한다.

* = 10

0 = 11

# = 12

 

참고: https://gimjinging.tistory.com/127

배운것

abs(_:)

절대값을 구해줍니다.

 

예제

var num = -10
print(num)
num = abs(num)
print(num)
// -10
// 10

 

728x90