본문 바로가기
TIL

[240330] 이중배열과 enumerated/contains(where:)

by 줍 2024. 3. 31.

1. 날씨가 좋아서 산책하고 싶었는데 마침 공원산책 문제가 있길래 풀었당. 방구석 산책러~ 문제 난이도랑은 별개로 제목이나 문제 내용이 참신해서 재밌을때가 있다 근데 막상 풀면 열받음

운좋게도 어제 봤던 이중배열+enumerated 풀이가 떠올라서 적용해봤다!

도착지뿐만 아니라 도착지까지 가는길에 있는 장애물도 확인해야했다. for문을 쓸까 하다가 클로저에 좀 더 익숙해지고 싶어서 써봤다.

주로 contains는 배열이 어떤 요소나 배열을 포함하는지 확인할때 많이 썼는데 클로저를 매개변수로 받을 수 있다는 걸 알게됐다.

이때 클로저가 true를 반환하는 요소가 하나라도 있으면 true를, 아니면 false를 반환한다.

func solution(_ park:[String], _ routes:[String]) -> [Int] {
    var (x, y) = (0, 0)
    var blocked: [[Int]] = []
    
    for (i, str) in park.enumerated() {
        for (j, char) in str.enumerated() {
            if char == "S" { (x, y) = (i, j) }
            if char == "X" { blocked.append([i, j]) }
        }
    }
    
    for route in routes {
        let a = route.split(separator: " ")
        let (direction, n) = (a[0], Int(a[1])!)
        
        switch direction {
        case "N":
            if x - n < 0 || (1...n).contains(where: { i in
                blocked.contains([x - i, y])
            }) { break }
            x -= n
        case "S":
            if x + n > park.count - 1 || (1...n).contains(where: { i in
                blocked.contains([x + i, y])
            }) { break }
            x += n
        case "E":
            if y + n > park[0].count - 1 || (1...n).contains(where: { i in
                blocked.contains([x, y + i])
            }) { break }
            y += n
        case "W":
            if y - n < 0 || (1...n).contains(where: { i in
                blocked.contains([x, y - i])
            }) { break }
            y -= n
        default:
            break
        }
    }
    return [x, y]
}