본문 바로가기
코딩 테스트/프로그래머스

[프로그래머스] (Swift) 공원 산책

by Dev.Andy 2023. 6. 12.

머리말

문제 링크

코딩테스트 연습 - 공원 산책 | 프로그래머스 스쿨

이 문제를 선택한 이유

  • 구현 문제 연습

풀이

풀이 순서

  1. park에서 String으로 되어 있는 요소를 [String]으로 바꾸어 parkMap으로 새로 할당
  2. 현재 위치 location 초기화
  3. "S"를 찾아 location에 할당
  4. w, h를 할당
  5. 동서남북에 따라 해당 거리만큼 움직이는 move 함수를 정의
    1. dx, dy로 나누어 각각 동서남북으로 구분
    2. 다만, 해당 거리만큼 움직였을 때 지도를 벗어나거나 "X"에 가로막혔을 때 원래의 위치를 반환
  6. 입력 값인 routes를 적절히 가공하여 move 함수에 대입하고 location의 요소를 반환

스위프트 코드

import Foundation

func solution(_ park: [String], _ routes: [String]) -> [Int] {
    var parkMap = park.map { Array($0) }
    var location = [-1, -1]

    outerLoop: for i in parkMap.indices {
        for j in parkMap[i].indices {
            if parkMap[i][j] == "S" {
                location = [i, j]
                break outerLoop
            }
        }
    }

    let (w, h) = (parkMap[0].count, parkMap.count)

    func move(_ direction: String, _ distance: Int) -> [Int] {

        var current = location

        let dx = [1, -1, 0, 0]
        let dy = [0, 0, 1, -1]

        let directions = ["E", "W", "S", "N"]
        let i = directions.firstIndex(of: direction)!

        for _ in 1...distance {
            let nextX = current[1] + dx[i]
            let nextY = current[0] + dy[i]

            if !(nextX >= 0 && nextX < w && nextY >= 0 && nextY < h
                && parkMap[nextY][nextX] != "X") {
                return location
            } else {
                current[1] = nextX
                current[0] = nextY
            }
        }
        return current
    }

    for route in routes {
        let command = route.split(separator: " ")
        let (direction, distance) = (String(command[0]), Int(command[1])!)
        location = move(direction, distance)
    }
    return [location[0], location[1]]
}

 

꼬리말

  • 그래프 탐색 문제 자체가 익숙하지 않아서 함수를 짜는 것에 어려움을 겪었다
  • 이 문제를 본보기 삼아서 표현식에 익숙해져야겠다.

댓글