[Algorithm] 프로그래머스 파일명 방문 길이
Updated:
문제 설명
나의 풀이 - 1
import Foundation
func solution(_ dirs:String) -> Int {
var checkVisited = [Point]()
for i in -5...5 {
for j in -5...5 {
if i == 0 && j == 0 {
checkVisited.append(Point(position: (i,j), visited: true))
}
else {
checkVisited.append(Point(position: (i,j)))
}
}
}
var currentX: Int = 0
var currentY: Int = 0
var count = 1
for dir in dirs {
if dir == "U" {
currentY += 1
}
else if dir == "D" {
currentY -= 1
}
else if dir == "L" {
currentX -= 1
}
else { // dir == "R"
currentX += 1
}
if currentX < -5 || currentX > 5 || currentY < -5 || currentY > 5 {
continue
}
else {
let index = checkVisited.firstIndex { p in
p.position == (currentX, currentY)
}
if checkVisited[index!].visited == false {
checkVisited[index!].visited = true
count += 1
}
}
}
return count
}
struct Point {
let position: (Int, Int)
var visited: Bool = false
}
처음에는 점의 개수를 파악해서 간 길을 파악했는데, 점으로만 파악하면 경로의 개수를 파악하지 않기 때문에 문제가 발생한다.
나의 풀이 - 2
따라서 점이 아닌 현재 위치에서 도착 위치 (x,y, nx, ny)
와 도착 위치에서 현재 위치 (nx, ny, x, y)
로의 경로 값들을 비교하면서 저장하여 개수를 카운트 하는 방식으로 수정하였다.
import Foundation
let delta = ["U": (0,1), "D": (0,-1), "L": (-1,0), "R": (1,0)]
func solution(_ dirs:String) -> Int {
var checkVisited = [(Int, Int, Int, Int)]()
var currentX: Int = 0
var currentY: Int = 0
for command in dirs {
let dx = delta[String(command)]!.0
let dy = delta[String(command)]!.1
let nx = currentX + dx
let ny = currentY + dy
if nx >= -5 && nx <= 5 && ny <= 5 && ny >= -5 {
let go = (currentX, currentY, nx, ny)
let back = (nx, ny, currentX, currentY)
currentX = nx
currentY = ny
var count = 0
for check in checkVisited {
if check == go {
break
}
count += 1
}
if count == checkVisited.count {
checkVisited.append(go)
checkVisited.append(back)
}
}
}
return checkVisited.count / 2
}
Leave a comment