머리말
문제 링크
이 문제를 선택한 이유
- 구현 문제 연습
풀이
풀이 순서
- park에서 String으로 되어 있는 요소를 [String]으로 바꾸어 parkMap으로 새로 할당
- 현재 위치 location 초기화
- "S"를 찾아 location에 할당
- w, h를 할당
- 동서남북에 따라 해당 거리만큼 움직이는 move 함수를 정의
- dx, dy로 나누어 각각 동서남북으로 구분
- 다만, 해당 거리만큼 움직였을 때 지도를 벗어나거나 "X"에 가로막혔을 때 원래의 위치를 반환
- 입력 값인 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]]
}
꼬리말
- 그래프 탐색 문제 자체가 익숙하지 않아서 함수를 짜는 것에 어려움을 겪었다
- 이 문제를 본보기 삼아서 표현식에 익숙해져야겠다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
옹알이 (2) (in Swift) | 프로그래머스 코딩테스트 (0) | 2024.03.13 |
---|---|
[프로그래머스] (2018 카카오) 프렌즈4블록 (0) | 2023.06.07 |
[프로그래머스] (Swift) 정수를 나선형으로 배치하기 (0) | 2023.06.05 |
[프로그래머스] (Swift) [카카오 1차] 다트 게임 (0) | 2023.06.02 |
[프로그래머스] 두 수의 합 (2) | 2023.05.30 |
댓글