알고리즘 문제 풀이

[Swift] 프로그래머스 LV2. 방문 길이

lgvv 2022. 4. 16. 12:42

프로그래머스 LV2. 방문 길이

 

✅ 쉬웠다. 

문득 드는 생각인데, 이렇게 잘 풀리는 문제만 푸는게 도움이 될까 싶다.. ㅠ

 

🟠 알고리즘 접근 및 풀이의 흐름사실 난이도 자체는 쉬운데 +9점이나 받았다. 카카오 문제가 더 까다로웠던 것 같은데..?

 

1. 처음에는 point = (x,y)로 두어서 방문한 point를 재방문 안하는 것으로 처리 문제점: (5,5) -> (4,5)와 (4,4) -> (4,5)를 구분할 수 없어서 문제 풀이의 오류 발생

 

2. 시작점과 도착점을 전부 저장하게끔 변경previousPoint, currentPoint = (5,5,4,5) 이런 식으로 저장따라서 어디에서 어디로 가는지 확인할 수 있어짐문제점 : 왔다갔다의 경우 중복으로 체크가 된다.예시 (4,5,5,5) (5,5,4,5)의 경우 사실상 동일 구간 왕복이나 2회로 저장된다.테스트케이스 : "LRLR" 정답: 1 

 

3. 시작점 -> 끝점, 끝점 -> 시작점 두개를 동시 비교하여 중복을 없앰이 부분은 visited.contains부분에서 비교하는 것을 확인할 수 있다. 이 부분의 코드를 약간만 해설하자면, check 또는 check2 중 어느 것이라도 들어있다면 true를 반환하고 여기에 not을 처리하여 최종적으로는 둘중 어느것도 들어있지 않은 경우에 visited.append를 수행하는 코드이다.

 

 

 

✅ 코드

//
//  49994.swift
//  Algorithm
//
//  Created by Hamlit Jason on 2022/04/16.
//
//https://programmers.co.kr/learn/courses/30/lessons/49994
import Foundation

struct p49994 {
    static func run() {
//        print(p49994.solution("LULLLLLLU")) // 7
//        print(p49994.solution("ULURRDLLU")) // 7
//        print(p49994.solution("UUUUDUDUDUUU")) // 5
        print(p49994.solution("LRLR")) // 1
    }
    
    static func solution(_ dirs:String) -> Int {
        
        var visited: [(Int, Int, Int, Int)] = [(5,5,5,5)] // (x,y) 시작점 -> (x,y) 끝점 루트 자체를 저장하자.
        
        var previousPoint = (5,5)
        var currentPoint = (5,5)
        
        var x = currentPoint.0
        var y = currentPoint.1
        
        for dir in dirs {
            switch dir {
            case "U":
                if y - 1 < 0 { // 판을 넘어가면
                    continue
                } else {
                    y -= 1
                }
                break
            case "L":
                if x - 1 < 0 {
                    continue
                } else {
                    x -= 1
                }
                break
            case "R":
                if x + 1 > 10 {
                    continue
                } else {
                    x += 1
                }
                break
            case "D":
                if y + 1 > 10 {
                    continue
                } else {
                    y += 1
                }
                break
            default: print("Default")
            }
            
            currentPoint = (x,y)
            let check = (previousPoint.0, previousPoint.1, currentPoint.0, currentPoint.1)
            let check2 = (currentPoint.0, currentPoint.1, previousPoint.0, previousPoint.1)
            previousPoint = currentPoint
            
            if !visited.contains(where: {
                return $0 == check || $0 == check2
            }) {
                visited.append(check)
            }
        }
        
        print(visited)
        return visited.count - 1
    }
}