ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithm] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค [์นด์นด์˜ค ์ธํ„ด] ํ‚คํŒจ๋“œ ๋ˆ„๋ฅด๊ธฐ Level1 (Swift)
    Algorithm 2022. 2. 6. 16:02
     

    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ‚คํŒจ๋“œ ๋ˆ„๋ฅด๊ธฐ

    [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

    ๋ฌธ์ œ ํ’€์ด

    ์ž…๋ ฅ์œผ๋กœ ์˜ค๋Š” numbers ๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆซ์ž๋“ค์„ ๋ˆ„๋ฅด๋Š”๋ฐ, ์ด ๋•Œ ์‚ฌ์šฉํ•œ ์†๊ฐ€๋ฝ์„ ๋ฌธ์ž์—ด๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ.

     

    ๋จผ์ € keypad๋ผ๋Š” ๋ฐฐ์—ด์— ํ‚คํŒจ๋“œ ํ˜•ํƒœ๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

    let keypad = [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"], ["*", "0", "#"]]

     

     

    ํ‚คํŒจ๋“œ ๋ฐฐ์—ด์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค.

     

     

     [1, 4, 7]์€ ์™ผ์† ์—„์ง€ ์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , [3, 6, 9]๋Š” ์˜ค๋ฅธ์† ์—„์ง€ ์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋”ฐ๋กœ ๋ฐฐ์—ด์— ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค.

    let leftOnly = [1, 4, 7] // ์™ผ์† ์—„์ง€์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅ
    let rightOnly = [3, 6, 9] // ์˜ค๋ฅธ์† ์—„์ง€์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅ

     

     

     

    ์™ผ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์œ„์น˜์™€ ์˜ค๋ฅธ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์œ„์น˜๋ฅผ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•œ๋‹ค.

    • ์ดˆ๊ธฐ๊ฐ’์€ ํ•ด๋‹น ์†๊ฐ€๋ฝ์˜ ์‹œ์ž‘ ์œ„์น˜.
    • ์™ผ์† ์—„์ง€ ์†๊ฐ€๋ฝ์€ *์—์„œ, ์˜ค๋ฅธ์† ์—„์ง€ ์†๊ฐ€๋ฝ์€ #์—์„œ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ, leftPosition์—๋Š” (3, 0)์„, rightPosition์—๋Š” (3, 2)๋ฅผ ์ €์žฅํ•œ๋‹ค.
    var leftPosition = (3, 0) // ์ตœ์ดˆ ์™ผ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์‹œ์ž‘ ์œ„์น˜
    var rightPosition = (3, 2) // ์ตœ์ดˆ ์˜ค๋ฅธ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์‹œ์ž‘ ์œ„์น˜

     

     

    numbers ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ for๋ฌธ์„ ํ†ตํ•ด ๋Œ๋ฉด์„œ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

     

    1. num์ด [1, 4, 7]์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ

    • ํ•ด๋‹น leftPosition์˜ ์œ„์น˜ ์ €์žฅ ํ›„, result์— “L”์— ์ถ”๊ฐ€

    2. num์ด [3, 6, 9]์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ

    • ํ•ด๋‹น rightPosition์˜ ์œ„์น˜ ์ €์žฅ ํ›„, result์— “R”์— ์ถ”๊ฐ€

    3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ

    num์˜ ์œ„์น˜๋ฅผ targetPosition์— ์ €์žฅํ•œ ํ›„, ํ˜„์žฌ leftPosition๊ณผ rightPosition์˜ ์œ„์น˜์™€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

     

    targetPosition๊ณผ ์™ผ์† ์—„์ง€ ์†๊ฐ€๋ฝ์˜ ๊ฑฐ๋ฆฌ : leftToTarget

    targetPosition๊ณผ ์˜ค๋ฅธ์† ์—„์ง€ ์†๊ฐ€๋ฝ์˜ ๊ฑฐ๋ฆฌ : rightToTarget

     

    3-1. leftToTarget์ด ๋” ํด ๊ฒฝ์šฐ

    • ์˜ค๋ฅธ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์ด๋™์‹œํ‚ค๊ณ , ํ•ด๋‹น rightPosition์˜ ์œ„์น˜ ์ €์žฅ ํ›„, result์— “R”์— ์ถ”๊ฐ€

    3-2. rightToTarget์ด ๋” ํด ๊ฒฝ์šฐ

    • ์™ผ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์ด๋™์‹œํ‚ค๊ณ , ํ•ด๋‹น leftPosition์˜ ์œ„์น˜ ์ €์žฅ ํ›„, result์— “L”์— ์ถ”๊ฐ€

    3-3. ๋‘ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ

    • ์™ผ์† ์žก์ด๋Š” result์— “L”์„, ์˜ค๋ฅธ์† ์žก์ด๋Š” result์— “R”์„ ์ถ”๊ฐ€

    for ๋ฌธ์„ ๋‹ค ๋Œ๊ณ  ๋‚œ ํ›„์— result๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด ์ •๋‹ต์ด๋‹ค.

     

    ์†Œ์Šค ์ฝ”๋“œ (Swift)

    //
    //  แ„แ…ตแ„‘แ…ขแ„ƒแ…ณแ„‚แ…ฎแ„…แ…ณแ„€แ…ต.swift
    //  Programmers
    //
    //  Created by ์•ˆ์ƒํฌ on 2022/02/06.
    //
    
    import Foundation
    
    func solution(_ numbers:[Int], _ hand:String) -> String {
        var result = ""
        let keypad = [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"], ["*", "0", "#"]]
        
        let leftOnly = [1, 4, 7] // ์™ผ์† ์—„์ง€์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅ
        let rightOnly = [3, 6, 9] // ์˜ค๋ฅธ์† ์—„์ง€์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅ
        
        var leftPosition = (3, 0) // ์™ผ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์œ„์น˜ (์ตœ์ดˆ ์‹œ์ž‘ ์œ„์น˜๋Š” *)
        var rightPosition = (3, 2) // ์˜ค๋ฅธ์† ์—„์ง€ ์†๊ฐ€๋ฝ ์œ„์น˜ (์ตœ์ดˆ ์‹œ์ž‘ ์œ„์น˜๋Š” #)
        
        for num in numbers {
            // 1, 4, 7์€ ์™ผ์† ์—„์ง€์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅ
            if leftOnly.contains(num) {
                result.append("L")
                
                // ์™ผ์† ์—„์ง€์†๊ฐ€๋ฝ ์ด๋™์‹œ์ผœ์ฃผ๊ธฐ
                MoveLeftHand: for i in 0..<4 {
                    for j in 0..<3 {
                        if let targetNum = Int(keypad[i][j]), targetNum == num {
                            leftPosition = (i, j) // ์œ„์น˜ ์ €์žฅ
                            break MoveLeftHand
                        }
                    }
                }
                continue
            }
            
            // 3, 6, 9๋Š” ์˜ค๋ฅธ์† ์—„์ง€์†๊ฐ€๋ฝ๋งŒ ๊ฐ€๋Šฅ
            if rightOnly.contains(num) {
                result.append("R")
                
                // ์˜ค๋ฅธ์† ์—„์ง€์†๊ฐ€๋ฝ ์ด๋™์‹œ์ผœ์ฃผ๊ธฐ
                MoveRightHand: for i in 0..<4 {
                    for j in 0..<3 {
                        if let targetNum = Int(keypad[i][j]), targetNum == num {
                            rightPosition = (i, j) // ์œ„์น˜ ์ €์žฅ
                            break MoveRightHand
                        }
                    }
                }
                continue
            }
            
            // ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ
            // target์˜ ์ธ๋ฑ์Šค ๊ตฌํ•˜๊ธฐ
            var targetIndex = (0, 0)
            GetTarget: for i in 0..<4 {
                for j in 0..<3 {
                    if let targetNum = Int(keypad[i][j]), targetNum == num {
                        targetIndex.0 = i
                        targetIndex.1 = j
                        break GetTarget
                    }
                }
            }
            
            // left, right์—์„œ target๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
            let leftToTarget = abs(leftPosition.0 - targetIndex.0) + abs(leftPosition.1 - targetIndex.1)
            let rightToTarget = abs(rightPosition.0 - targetIndex.0) + abs(rightPosition.1 - targetIndex.1)
            
            if leftToTarget < rightToTarget {
                // ์™ผ์ชฝ ์—„์ง€์†๊ฐ€๋ฝ ์ด๋™์‹œํ‚ค๊ธฐ
                leftPosition = (targetIndex.0, targetIndex.1)
                result.append("L")
            } else if leftToTarget > rightToTarget {
                // ์˜ค๋ฅธ์ชฝ ์—„์ง€์†๊ฐ€๋ฝ ์ด๋™์‹œํ‚ค๊ธฐ
                rightPosition = (targetIndex.0, targetIndex.1)
                result.append("R")
            } else if leftToTarget == rightToTarget {
                if hand == "left" {
                    leftPosition = (targetIndex.0, targetIndex.1)
                    result.append("L")
                } else {
                    rightPosition = (targetIndex.0, targetIndex.1)
                    result.append("R")
                }
            }
            
        }
        return result
    }
    

     

    ๋Œ“๊ธ€

Designed by Tistory.