MUKER_DEV with iOS

[swift] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - ν‚€νŒ¨λ“œ λˆ„λ₯΄κΈ° λ³Έλ¬Έ

πŸ€– μ•Œκ³ λ¦¬μ¦˜/programmers

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

MUKER 2023. 1. 19. 14:09
 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr


문제 ν‘ΈλŠ” 데 μžˆμ–΄ 도움이 λ˜λ„λ‘ λ‚˜μ˜ 풀이와 κ°œμ„ λœ 풀이λ₯Ό μ˜¬λ¦½λ‹ˆλ‹€.
λ˜ν•œ 풀이 ν›„ λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보고 μ°Έκ³ ν• λ§Œν•œ 풀이도 μ˜¬λ¦½λ‹ˆλ‹€.

- λ¬Έμ œμ— 따라 λ‚˜μ˜ ν’€μ΄λ§Œ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•΄λ‹Ή 풀이듀은 풀이 쀑 ν•˜λ‚˜μΌ 뿐 μ΅œμ„ μ˜ ν’€μ΄λŠ” 아닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ‚˜μ˜ 풀이

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    var result = [String]()
    var state = [0,0]
    var lastLeft = 1
    var lastRight = 1
    var center = ["0":0, "8":1, "5":2, "2":3]
    
    func calculate(num: String) {
        var left = abs(center[num]! - state[0]) + lastLeft
        var right = abs(center[num]! - state[1]) + lastRight
        if num == "0" {
            if left < right { result.append("L"); state[0] = 0; lastLeft = 0; return }
            if left > right { result.append("R"); state[1] = 0; lastRight = 0; return }
            if hand == "left" { result.append("L"); state[0] = 0; lastLeft = 0; return }
            else { result.append("R"); state[1] = 0; lastRight = 0; return }
        }
        if num == "8" {
            if left < right { result.append("L"); state[0] = 1; lastLeft = 0; return }
            if left > right { result.append("R"); state[1] = 1; lastRight = 0; return }
            if hand == "left" { result.append("L"); state[0] = 1; lastLeft = 0; return }
            else { result.append("R"); state[1] = 1; lastRight = 0; return }
        }
        if num == "5" {
            if left < right { result.append("L"); state[0] = 2; lastLeft = 0; return }
            if left > right { result.append("R"); state[1] = 2; lastRight = 0; return }
            if hand == "left" { result.append("L"); state[0] = 2; lastLeft = 0; return }
            else { result.append("R"); state[1] = 2; lastRight = 0; return }
        }
        if num == "2" {
            if left < right { result.append("L"); state[0] = 3; lastLeft = 0; return }
            if left > right { result.append("R"); state[1] = 3; lastRight = 0; return }
            if hand == "left" { result.append("L"); state[0] = 3; lastLeft = 0; return }
            else { result.append("R"); state[1] = 3; lastRight = 0; return }
        }
    }
    
    numbers.forEach { i in
        var num = String(i)
        switch num {
        case "7": result.append("L"); state[0] = 1; lastLeft = 1
        case "4": result.append("L"); state[0] = 2; lastLeft = 1
        case "1": result.append("L"); state[0] = 3; lastLeft = 1
        case "9": result.append("R"); state[1] = 1; lastRight = 1
        case "6": result.append("R"); state[1] = 2; lastRight = 1
        case "3": result.append("R"); state[1] = 3; lastRight = 1
        case "0": calculate(num: num)
        case "8": calculate(num: num)
        case "5": calculate(num: num)
        case "2": calculate(num: num)
        default :
            break
        }
    }
    return result.joined()
}

 

* ν•΄λ‹Ή ν’€μ΄λŠ” λΉ„μΆ”μ²œμž…λ‹ˆλ‹€. μ°Έκ³ ν• λ§Œν•œ 풀이λ₯Ό μ°ΎμœΌμ‹ λ‹€λ©΄ 밑에 μ½”λ“œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

 

숫자 1,4,7은 무쑰건 "L"을 return

숫자 3,6,9λŠ” 무쑰건 "R"을 return

ν•˜κ²Œ λœλ‹€.

 

μ€‘μš”ν•œκ±΄

숫자 0,2,5,8을 μ²˜λ¦¬ν•˜λŠ”κ±΄λ°

두 손가락 쀑 λ§ˆμ§€λ§‰ μœ„μΉ˜κ°€ μˆ«μžμ— κ°€κΉŒμš°λ©΄

κ°€κΉŒμš΄ 손가락이 숫자λ₯Ό λˆ„λ₯΄κ²Œ ν•΄μ€˜μ•Όν•œλ‹€.

 

λͺ‡ 가지 λ³€μˆ˜λ₯Ό μ§€μ •ν•΄μ€¬λŠ”λ°

 

state[0] μ—λŠ” μ™Όμͺ½ μ†κ°€λ½μ˜ 측을 (7이면 1μΈ΅, 4λ©΄ 2μΈ΅, 1이면 3μΈ΅)

λ§ˆμ°¬κ°€μ§€λ‘œ

state[1] μ—λŠ” 였λ₯Έμͺ½ μ†κ°€λ½μ˜ 측을 μ €μž₯ν•˜κ²Œ λœλ‹€.

 

lastLeft와 lastRightλŠ”

1일 λ•ŒλŠ” μ™Όμͺ½μ΄λ‚˜, 였λ₯Έμͺ½μ— λ§ˆμ§€λ§‰ 손가락이 μžˆμ—ˆλ˜κ±°κ³ 

0일 λ•ŒλŠ” 손가락이 κ°€μš΄λ° μžˆμ—ˆλ˜ 정보λ₯Ό μ €μž₯해놨닀.

 

λ§Œμ•½ κ°€μš΄λ° 번호λ₯Ό λˆ„λ₯Ό λ•Œ

λ§ˆμ§€λ§‰ 손가락 μœ„μΉ˜κ°€ κ°€μš΄λ°μ˜€λ‹€λ©΄

1만큼의 μ›€μ§μž„μ„ μ΅œμ†Œν™”ν•˜κΈ° λ•Œλ¬Έμ—

κ·Έ 값을 μ μš©ν•˜κΈ° μœ„ν•΄μ„œλ‹€.

 

κΉ”λ”ν•œ μ½”λ“œκ°€ μ•„λ‹ˆμ–΄μ„œ 직관적이지 μ•Šμ§€λ§Œ

λ‚˜λ¦„ μƒν•˜μ’Œμš° μœ„μΉ˜λ₯Ό ꡬ할 수 있게 λœλ‹€.

 

숫자마자 ν•΄λ‹Ή μœ„μΉ˜ 쑰건을 λ”°μ Έ

닡을 ꡬ할 수 있게 λœλ‹€.

 

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ

μ’‹μ€μ½”λ“œλŠ” μ•„λ‹ˆλΌ

μ°Έκ³ ν•˜μ‹œλŠ”κ±΄ λΉ„μΆ”μž…λ‹ˆλ‹€.

 

 

 


μ°Έκ³ ν• λ§Œν•œ 풀이

import Foundation

func solution(_ numbers:[Int], _ hand:String) -> String {
    var result:String = ""
    let dic:[Int:[Int]] = [
        1:[0,0],
        2:[0,1],
        3:[0,2],
        4:[1,0],
        5:[1,1],
        6:[1,2],
        7:[2,0],
        8:[2,1],
        9:[2,2],
        0:[3,1],
    ]
    var lastL:[Int] = [3,0]
    var lastR:[Int] = [3,2]

    for number in numbers {
        if number == 1 || number == 4 || number == 7 {
            lastL = dic[number]!
            result += "L"
        } else if number == 3 || number == 6 || number == 9 {
            lastR = dic[number]!
            result += "R"
        } else {
            var sizeL = abs(lastL[0]-dic[number]![0])+abs(lastL[1]-dic[number]![1])
            var sizeR = abs(lastR[0]-dic[number]![0])+abs(lastR[1]-dic[number]![1])
            if sizeL < sizeR || (sizeL == sizeR && hand == "left") {
                lastL = dic[number]!
                result += "L"
            } else {
                lastR = dic[number]!
                result += "R"
            }
        }
    }
    return result
}

 

μ•Œκ³ λ¦¬μ¦˜μ€ κ°™λ‹€κ³  ν•  수 μžˆμ§€λ§Œ

훨씬 κΉ”λ”ν•˜κ²Œ μ§  μ½”λ“œμž…λ‹ˆλ‹€.

 

숫자의 μœ„μΉ˜μ •λ³΄λ₯Ό λ”•μ…”λ„ˆλ¦¬λ‘œ, κ°’μ—λŠ” μ’Œν‘œλ°°μ—΄μ„ λ„£μ—ˆμŠ΅λ‹ˆλ‹€.

 

0,2,5,8을 μ²˜λ¦¬ν•˜λŠ” λΆ€λΆ„λ§Œ

ν•œλ²ˆ μƒκ°ν•΄λ³΄λ©΄μ„œ λ³΄μ‹œλ©΄ λ κ±°κ°™μŠ΅λ‹ˆλ‹€.