새소식

인기 검색어

프로그래머스/Lv.2

[Swift] 조이스틱

  • -
import Foundation

// -------- 방법1 -------- //
func solution(_ name:String) -> Int {
    
    var visited: [Bool] = Array(repeating: false, count: name.count)
    
    let result = name.enumerated().compactMap {
        if $0.element != "A" {
            let ascii = $0.element.asciiValue!
            return Int(min(ascii - 65, 91-ascii))
        } else {
            visited[$0.offset] = true
            return nil
        }
    }.reduce(0, +)
    
    var move: [Int] = []
    
    
    func dfs(visited: [Bool], index: Int, count: Int) {
        var visited = visited
        var index = index
        var count = count
        
        if name.count - 1 < count { return }
        if index < 0 { index = name.count - 1 }
        if index > name.count - 1 { index = 0 }
        
        visited[index] = true
        
        if !visited.contains(false) {
            move.append(count)
            return
        }

        count += 1
        dfs(visited: visited, index: index + 1, count: count)
        dfs(visited: visited, index: index - 1, count: count)
    }
    
    dfs(visited: visited, index: 0, count: 0)
    
    return result + move.min()!
}
// -------- 방법1 -------- //



// -------- 방법2 -------- //
func solution2(_ name:String) -> Int {
    var ans = 0
    let name = name.map({$0})
    for i in 0..<name.count {
        if name[i] != "A" {
            let up = name[i].asciiValue! - 65
            let down = 91 - name[i].asciiValue!
            ans += Int((up<down) ? up : down)
        }
    }
    
    /*
     조이스틱을 왼쪽 오른쪽으로 이동가능.
     즉 문자가 아무리 많던 가운데 A가 있을때 A를 제외한 양쪽끝의 문자의 이동거리를 비교하면 되는 것
     예시 1) ABAAACA 일때 가운데 AAA를 기준으로 양쪽끝 BC의 이동거리를 비교하면됨
     순서대로 이동했을시 0123456 역으로 이동시 01065
     예시 2) AABCAAADA 일때 가운데 AAAAAA를 기준으로 양쪽끝 CD의 이동거리를 비교
     정상적으로 이동시 0123456789 역으로 이동시 012321098
     i(name[i] 까지 오는 거리) + i(다시 왼쪽끝으로 이동하는 거리) + name.count - next(반대쪽 끝의 문자까지 이동하는 거리)
     */
    
    var minMove = name.count-1
    for i in 0..<name.count {
        if name[i] != "A" {
            var next = i + 1
            while next<name.count && name[next] == "A" {
                next += 1
            }
            let move = 2 * i + name.count - next
            
            minMove = min(move, minMove)
        }
    }
    return ans + minMove
}
// -------- 방법2 -------- //

 

'프로그래머스 > Lv.2' 카테고리의 다른 글

[Swift] 큰 수 만들기  (0) 2023.04.27
[Swift] 연속 부분 수열 합의 개수  (0) 2023.04.25
[Swift] 택배 배달과 수거하기  (0) 2023.03.13
[Swift] 귤 고르기  (0) 2023.03.13
[Swift] 압축  (1) 2023.03.13
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.