본문 바로가기
Algorithm

SwiftUI: 공원 산책

by songmoro 2023. 8. 29.
728x90

문제 링크

 

배열을 사용해서 푸는 문제인데 2차원 배열을 1차원 배열로 사용해야 돼서 아래처럼 불편한 접근법 밖에 생각이 안 났어요.

print(park[0][park[0].index(park[0].startIndex, offsetBy: 1)])

 

그래서 시작 포인트 찾으면서 2차원 배열 새로 만들었고, 입력이 적어서 시간 초과는 안 뜰 것 같아 적당히 조건문만 작성해서 통과했습니다.

 

그런데 다른 분들 코드 보니까 enum case, 상하좌우 [0, 1], [1, 0], [0, -1], [-1, 0]처럼 좀 더 깔끔하게 코드 짤 수 있는 방법을 알아서 다음에 배열 문제 다시 풀 때는 적용해서 풀어보려고요.

 

func solution(_ park:[String], _ routes:[String]) -> [Int] {
    let H = park.count - 1
    let W = park[0].count - 1
    
    var currentW = -1
    var currentH = -1
    
    
    var parkArray: [[String.Element]] = Array(repeating: Array(repeating: "O", count: W + 1), count: H + 1)
    
    park.enumerated().map { i, iStr in
        iStr.enumerated().map { j, jStr in
            parkArray[i][j] = jStr
            
            if jStr == "S" {
                currentH = i
                currentW = j
            }
        }
    }
    
    for route in routes {
        let point = route.first!
        let count = route.last!.wholeNumberValue!
        var isPass = true
        
        switch point {
        case "N":
            if (currentH - count) >= 0 {
                for tempH in 1..<count+1 {
                    if parkArray[currentH - tempH][currentW] == "X" {
                        isPass = false
                        break
                    }
                }
                
                if isPass {
                    currentH -= count
                }
            }
        case "S":
            if (currentH + count) <= H {
                for tempH in 1..<count+1 {
                    if parkArray[currentH + tempH][currentW] == "X" {
                        isPass = false
                        break
                    }
                }
                
                if isPass {
                    currentH += count
                }
            }
        case "W":
            if (currentW - count) >= 0 {
                for tempW in 1..<count+1 {
                    if parkArray[currentH][currentW - tempW] == "X" {
                        isPass = false
                        break
                    }
                }
                
                if isPass {
                    currentW -= count
                }
            }
        case "E":
            if (currentW + count) <= W {
                for tempW in 1..<count+1 {
                    if parkArray[currentH][currentW + tempW] == "X" {
                        isPass = false
                        break
                    }
                }
                
                if isPass {
                    currentW += count
                }
            }
        default: break
        }
    }
    return [currentH, currentW]
}

 

728x90

'Algorithm' 카테고리의 다른 글

SwiftUI: 덧칠하기  (1) 2023.12.17
SwiftUI: 추억 점수  (0) 2023.12.17
SwiftUI: 성격 유형 검사하기  (1) 2023.12.17
SwiftUI: 개인정보 수집 유효기간  (0) 2023.08.30
SwiftUI: 달리기 경주  (0) 2023.08.12