알고리즘 문제 풀이
[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
}
}