[Algorithm] 프로그래머스 파일명 방문 길이

Updated:

문제 설명

34353637

나의 풀이 - 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
}

참고

Programmers

Leave a comment