https://programmers.co.kr/learn/courses/30/lessons/49994
현재 지점의 x값과 y값은 각각 x, y에 저장한다. dirs 문자열에서 문자 하나씩 떼서 move함수를 돌린다. map({ $0 })에서 $0은 Character 타입이므로 주의하자. inout은 함수에서 직접 파라미터 값에 접근할 수 있도록 해주는 기능이다. move 함수는 현재의 x값과 y값, dir과 db를 받아 이동시킨 후, 이동 경로를 db에 저장한다.
let dirs = "LULLLLLLU"
func solution(_ dirs: String) -> Int {
let dirArr = dirs.map({ $0 })
var x = 0
var y = 0
var db = Set<String>() // "x1y1x2y2"
for dir in dirArr {
move(&x, &y, &db, dir)
}
return db.count / 2
}
시작 지점(x1, y1)과 도착 지점(x2, y2)가 있을 경우, 그 경로를 String 형태인 "x1y1x2y2"로 저장한다. (x1, y1)에서 (x2, y2)로 이동하는 길과 반대로 (x2, y2)에서 (x1, y1)로 이동하는 길이 같으므로, 두 값 다 db에 넣도록 한다.
func saveToDb(_ x1: Int, _ y1: Int, _ x2: Int, _ y2: Int, _ db: inout Set<String>) {
db.insert("\(x1)\(y1)\(x2)\(y2)")
db.insert("\(x2)\(y2)\(x1)\(y1)")
}
위에서 명시했던 대로 move 함수는 현재의 x, y값, dir, db를 받는다. dir의 종류가 4가지이고, 종류마다 수행할 일이 다르므로 switch문을 써서 나타내였다. 예를 들어 dir이 "U"인 경우, y가 5이면 이동하지 않고, 그렇지 않으면 이동한다. 현재의 좌표와 이동한 후(y좌표가 1 증가)의 좌표를 move 함수에 준다.
func move(_ x: inout Int, _ y: inout Int, _ db: inout Set<String>, _ dir: Character) {
switch dir {
case "U": if y != 5 {
saveToDb(x, y, x, (y + 1), &db)
y += 1
}
case "D": if y != -5 {
saveToDb(x, y, x, (y - 1), &db)
y -= 1
}
case "L": if x != -5 {
saveToDb(x, y, (x - 1), y, &db)
x -= 1
}
case "R": if x != 5 {
saveToDb(x, y, (x + 1), y, &db)
x += 1
}
default: break
}
}