λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1] ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°

by hyebin (Helia) 2023. 2. 28.
λ°˜μ‘ν˜•
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 λͺ¨μŒ

ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ°

문제 μ„€λͺ…

슀마트폰 μ „ν™” ν‚€νŒ¨λ“œμ˜ 각 칸에 λ‹€μŒκ³Ό 같이 μˆ«μžλ“€μ΄ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€.

 

이 μ „ν™” ν‚€νŒ¨λ“œμ—μ„œ μ™Όμ†κ³Ό μ˜€λ₯Έμ†μ˜ μ—„μ§€μ†κ°€λ½λ§Œμ„ μ΄μš©ν•΄μ„œ μˆ«μžλ§Œμ„ μž…λ ₯ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
맨 μ²˜μŒ μ™Όμ† μ—„지손가락은 * ν‚€νŒ¨λ“œμ— μ˜€λ₯Έμ† μ—„지손가락은 # ν‚€νŒ¨λ“œ μœ„μΉ˜μ—μ„œ μ‹œμž‘ν•˜λ©°, μ—„지손가락을 μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 엄지손가락은 μƒν•˜μ’Œμš° 4κ°€μ§€ λ°©ν–₯으둜만 이동할 수 있으며 ν‚€νŒ¨λ“œ 이동 ν•œ 칸은 거리둜 1에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.
  2. μ™Όμͺ½ μ—΄μ˜ 3개의 숫자 1, 4, 7을 μž…λ ₯ν•  λ•ŒλŠ” 왼손 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  3. 였λ₯Έμͺ½ μ—΄μ˜ 3개의 숫자 3, 6, 9λ₯Ό μž…λ ₯ν•  λ•ŒλŠ” 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  4. κ°€μš΄λ° μ—΄μ˜ 4개의 숫자 2, 5, 8, 0을 μž…λ ₯ν•  λ•ŒλŠ” 두 μ—„μ§€μ†κ°€λ½μ˜ ν˜„μž¬ ν‚€νŒ¨λ“œμ˜ μœ„μΉ˜μ—μ„œ 더 κ°€κΉŒμš΄ 엄지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.
    • 4-1. λ§Œμ•½ λ‘ μ—„μ§€μ†κ°€λ½μ˜ κ±°λ¦¬κ°€ κ°™λ‹€λ©΄, μ˜€λ₯Έμ†μž‘μ΄λŠ” μ˜€λ₯Έμ† μ—„지손가락, μ™Όμ†μž‘μ΄λŠ” μ™Όμ† μ—„지손가락을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μˆœμ„œλŒ€λ‘œ λˆ„λ₯Ό λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ numbers, μ™Όμ†μž‘μ΄μΈμ§€ 였λ₯Έμ†μž‘이인 μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ handκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 각 번호λ₯Ό λˆ„λ₯Έ 엄지손가락이 왼손인 μ§€ 였λ₯Έμ†μΈ μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ—°μ†λœ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

μ œν•œ 사항

  • numbers λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • numbers λ°°μ—΄ μ›μ†Œμ˜ 값은 0 이상 9 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.
  • handλŠ” "left" λ˜λŠ” "right"μž…λ‹ˆλ‹€.
    • "left"λŠ” μ™Όμ†μž‘μ΄, "right"λŠ” 였λ₯Έμ†μž‘이λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • 왼손 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” L, 였λ₯Έμ† 엄지손가락을 μ‚¬μš©ν•œ κ²½μš°λŠ” R을 μˆœμ„œλŒ€λ‘œ 이어 λΆ™μ—¬ λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•΄μ£Όμ„Έμš”.

μž…μΆœλ ₯ 예

numbers hand result
[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"

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • μˆœμ„œλŒ€λ‘œ λˆŒλŸ¬μ•Ό ν•  λ²ˆν˜Έκ°€ [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]이고, μ˜€λ₯Έμ†μž‘μ΄μž…λ‹ˆλ‹€.

  • λ”°λΌμ„œ "LRLLLRLLRRL"λ₯Ό return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • μ™Όμ†μž‘μ΄κ°€ [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]λ₯Ό μˆœμ„œλŒ€λ‘œ λˆ„λ₯΄λ©΄ μ‚¬μš©ν•œ μ†μ€ "LRLLRRLLLRR"이 λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • 였λ₯Έμ†μž‘이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]λ₯Ό μˆœμ„œλŒ€λ‘œ λˆ„λ₯΄λ©΄ μ‚¬μš©ν•œ μ†μ€ "LLRLLRLLRL"이 λ©λ‹ˆλ‹€.

제좜

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    var l = 10
    var r = 12
    var re = ""

    for i in numbers{
        if i == 1 || i == 4 || i == 7{
            re += "L"
            l = i
        }
        else if i == 3 || i == 6 || i == 9{
            re += "R"
            r = i
        }
        else{
            var a = i
            if i == 0{
                a = 11
            }
            if  (abs(a - l) % 3) + (abs(a - l) / 3) > (abs(a - r) % 3) + (abs(a - r) / 3) {
                re += "R"
                r = a
            }
            else if (abs(a - r) % 3) + (abs(a - r) / 3) > (abs(a - l) % 3) + (abs(a - l) / 3) {
                re += "L"
                l = a
            }
            else{
                if hand == "right"{
                    re += "R"
                    r = a
                }
                else{
                    re += "L"
                    l = a
                }
            }
        }
    }
    return re
}
처음 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ, μ™Όμ†μ˜ ν˜„μž¬ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜ l은 10으둜, r은 12둜 μ„€μ •ν•œλ‹€.
μˆœμ„œλŒ€λ‘œ numbers λ°°μ—΄μ˜ μš”μ†Œλ₯Ό λΉ„κ΅ν•œλ‹€.
ν‚€νŒ¨λ“œ μˆ«μžκ°€ 1,4,7 μΈκ²½μš°μ—λŠ” 왼손을 μ‚¬μš©ν•˜κ³ , l을 ν˜„μž¬ 숫자둜 λ³€κ²½ν•œλ‹€.
ν‚€νŒ¨λ“œ μˆ«μžκ°€ 3,6,9 μΈκ²½μš°μ—λŠ” 였λ₯Έμ†μ„ μ‚¬μš©ν•˜κ³ , r을 ν˜„μž¬ 숫자둜 λ³€κ²½ν•œλ‹€.

λ‚˜λ¨Έμ§€ κ²½μš°μ—λŠ” (ν˜„μž¬μœ„μΉ˜ - 각 μ†μ˜ μœ„μΉ˜)의 μ ˆλŒ“κ°’μ„ 3으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€μ™€, 3으둜 λ‚˜λˆˆ λͺ«μ˜ 합을 λΉ„κ΅ν•œλ‹€.
합이 더 μž‘μ€ κ²½μš°κ°€ κ°€κΉŒμš΄ 경우이기 λ•Œλ¬Έμ— 합이 더 μž‘μ€ 손을 μ‚¬μš©ν•œ ν›„ ν˜„μž¬ μœ„μΉ˜λ₯Ό λ³€κ²½ν•œλ‹€.
합이 κ°™λ‹€λ©΄ μ™Όμ†μž‘μ΄μΈμ§€, 였λ₯Έμ†μž‘이인지에 따라 κ²°μ •ν•œλ‹€.

λ‹€λ₯Έ 풀이

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    let keypad = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]
    var result = ""
    var current = [[3,0], [3,2]]
    
    for n in numbers{
        if n == 1 || n == 4 || n == 7 {
            result += "L"
            current[0] = keypad[n]
        }else if  n == 3 || n == 6 || n == 9 {
            result += "R"
            current[1] = keypad[n]
        }else{
            let left = abs(current[0][0]-keypad[n][0]) + abs(current[0][1]-keypad[n][1])
            let right = abs(current[1][0]-keypad[n][0]) + abs(current[1][1]-keypad[n][1])
            
            if left == right{
                let h = hand == "right" ? 1 : 0
                result += h == 1 ? "R" : "L"
                current[h] = keypad[n]
            }
            else if left > right{
                result += "R"
                current[1] = keypad[n]
            }else{
                result += "L"
                current[0] = keypad[n]
            }
        }
    }
    
    return result
}
keypad 배열을 μƒμ„±ν•˜μ—¬ 각 μΈλ±μŠ€μ— λŒ€ν•œ keypad의 μ’Œν‘œλ₯Ό μ €μž₯ν•œλ‹€.
ν˜„μž¬ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ°°μ—΄ currentλŠ” μ™Όμͺ½μ€ (인덱슀 0) 3,0으둜 였λ₯Έμͺ½μ€(인덱슀 1) 3,2둜 μ €μž₯ν•œλ‹€.

numbers의 λ°°μ—΄ μš”μ†Œλ₯Ό μˆœμ„œλŒ€λ‘œ λΉ„κ΅ν•œλ‹€.
μˆ«μžκ°€ 1, 4, 7인 경우 왼손을 μ‚¬μš©ν•˜κ³  μ™Όμ†μ˜ ν˜„μž¬μœ„μΉ˜λ₯Ό keypad λ°°μ—΄μ˜ n번째 인덱슀의 μœ„μΉ˜λ‘œ λ³€κ²½ν•œλ‹€.
μˆ«μžκ°€ 3, 6, 9인 경우 였λ₯Έμ†μ„ μ‚¬μš©ν•˜κ³  였λ₯Έμ†μ˜ ν˜„μž¬μœ„μΉ˜λ₯Ό keypad λ°°μ—΄μ˜ n번째 인덱슀의 μœ„μΉ˜λ‘œ λ³€κ²½ν•œλ‹€.

λ‚˜λ¨Έμ§€ κ²½μš°μ—λŠ” 각 μ†μ˜ ν˜„μž¬ μ’Œν‘œμ™€ 숫자의 μ’Œν‘œμ˜ μ°¨λ₯Ό κ΅¬ν•œ ν›„, μ ˆλŒ“κ°’μ„ ꡬ해 μ €μž₯ν•œλ‹€.
κ³„μ‚°ν•œ 값이 λ™μΌν•˜λ‹€λ©΄ μ™Όμ†μž‘μ΄μΈμ§€, 였λ₯Έμ†μž‘이인지에 따라 κ²°μ •ν•œλ‹€.
였λ₯Έμͺ½ 값이 적닀면 였λ₯Έμ†μ„ μ‚¬μš©ν•˜κ³  였λ₯Έμ†μ˜ ν˜„μž¬μœ„μΉ˜λ₯Ό keypad λ°°μ—΄μ˜ n번째 인덱슀의 μœ„μΉ˜λ‘œ λ³€κ²½ν•œλ‹€.
μ™Όμͺ½ 값이 적닀면 왼손을 μ‚¬μš©ν•˜κ³  μ™Όμ†μ˜ ν˜„μž¬μœ„μΉ˜λ₯Ό keypad λ°°μ—΄μ˜ n번째 인덱슀의 μœ„μΉ˜λ‘œ λ³€κ²½ν•œλ‹€.
λ°˜μ‘ν˜•