본문 바로가기
알고리즘

[Swift] 프로그래머스 - 키패드 누르기

by 고고 2021. 11. 3.

프로그래머스 문제 : 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

 

안녕하세요 ◠‿◠  고고입니다.

오늘은 프로그래머스에 있는 2020 카카오 인턴십 키패드 누르기를 풀어보았습니다.

 

1에서 4까지의 거리는 1입니다. 4 / 3 = 1 입니다.

1에서 5까지의 거리는 2입니다. 4 / 3 + 4 % 3 = 1 + 1 = 2 입니다.

3으로 나눈 몫과 나머지를 더하면 거리를 구할 수 있습니다.

 

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    var result = ""
    var left = 10
    var right = 12
    
    func appendLeft(number: Int) {
        left = number
        result.append("L")
    }
    
    func appendRight(number: Int) {
        right = number
        result.append("R")
    }
    
    for number in numbers {
        let number = number == 0 ? 11 : number // 0이면 11로 대체.
        
        if number == 1 || number == 4 || number == 7 { // "L"
            appendLeft(number: number)
        } else if number == 3 || number == 6 || number == 9 { // "R"
            appendRight(number: number)
        } else { // 중간 숫자들
            // a부터 b까지의 거리 = abs(a - b) / 3 + abs(a - b) % 3
            let Ldiff = abs(left - number) / 3 + abs(left - number) % 3
            let Rdiff = abs(right - number) / 3 + abs(right - number) % 3
            
            if Ldiff < Rdiff { // 왼손이 더 가까움
                appendLeft(number: number)
            } else if Ldiff > Rdiff {
                appendRight(number: number)
            } else { // 똑같다면 왼손/오른손잡이
                if hand == "left" {
                    appendLeft(number: number)
                } else {
                    appendRight(number: number)
                }
            }
        }
    }
    return result
}

print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right")) // "LRLLLRLLRRL"
print(solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left")) // "LRLLRRLLLRR"
print(solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right")) // "LLRLLRLLRL"

 

댓글