중복 경로를 제거, 방문한 총 길이를 구하는 문제.
Hashable
프로토콜을 사용하면 특정 구조체를 집합의 원소로 사용할 수 있기 때문에 경로(노드1-노드2, 노드2-노드1) 자체를 집합의 원소로 카운트했다.
BFS
를 통해 원점에서 방문 가능한 총 길이를 리턴할 수도 있다.BFS
를 통해 푸는 게 메모리적 측면에서 보다 효율적일 수 있을 것 같다.import Foundation
struct Position: Hashable {
var row: Int
var col: Int
}
struct Positions: Hashable {
let position1: Position
let position2: Position
}
func solution(_ dirs:String) -> Int {
var positionSet = Set<Positions>()
var curPos = Position(row: 0, col: 0)
for dir in dirs {
var nextRow = curPos.row
var nextCol = curPos.col
switch dir {
case "U":
nextRow += 1
case "D":
nextRow -= 1
case "R":
nextCol += 1
case "L":
nextCol -= 1
default:
continue
}
if nextRow < -5 || nextRow > 5 || nextCol < -5 || nextCol > 5 {
continue
} else {
let nextPos = Position(row: nextRow, col: nextCol)
let route1 = Positions(position1: curPos, position2: nextPos)
let route2 = Positions(position1: nextPos, position2: curPos)
positionSet.insert(route1)
positionSet.insert(route2)
curPos = nextPos
}
}
return positionSet.count / 2
}