티스토리 뷰
문제
https://school.programmers.co.kr/learn/courses/30/lessons/49994
풀이
- 입력의 최대 이동이 500이므로 단순 반복으로 풀리는 문제
- check함수를 통해서 경로로 이동한적있는지 확인
- 주의 사항
- 좌표 평면을 넘어가는 경우 처리
- (x1,y1) → (x2,y2) 로 가는 경우 경로는 그 반대인 (x2,y2) → (x1,y1) 도 체크 해줘야 한다 ( 이 문제에서 길은 양방향이기 때문)
- 결과를 반환할때 경로를 양쪽에서 넣었기 때문에 개수 / 2를 해줘야한다.
전체코드
import Foundation
func solution(_ dirs:String) -> Int {
var cur: (Int, Int) = (0, 0) // (x,y)
let moves: [String:(Int, Int)] = ["U":(0, 1), "D":(0, -1), "L":(-1, 0), "R":(1, 0)] // 이동값
let dirs: [String] = dirs.map{ String($0) } // 이동할 경로
var roots: [((Int,Int), (Int,Int))] = [] //이동한 경로
// (x1,y1) -> (x2,y2) 또는 (x2,y2) -> (x1,y1)
for dir in dirs {
let move: (Int, Int) = moves[dir]!
let start: (Int, Int) = cur // 출발 위치
let end: (Int, Int) = (cur.0+move.0, cur.1+move.1) // 도착 위치
//이동 가능한 경우
if (end.0 >= -5 && end.0 <= 5) && (end.1 >= -5 && end.1 <= 5) {
if !check(roots, start, end) { //이동한적 없는 경로면 경로 저장
roots.append((start,end))
roots.append((end,start))
}
cur = end
}
}
return roots.count / 2
}
func check(_ roots: [((Int,Int), (Int,Int))], _ start: (Int, Int), _ end: (Int, Int)) -> Bool {
//start : 출발지, end : 도착지
let dir: ((Int, Int), (Int, Int)) = (start, end)
for root in roots {
if dir.0.0 == root.0.0 && dir.0.1 == root.0.1 && dir.1.0 == root.1.0 && dir.1.1 == root.1.1 {
return true
}
}
return false
}'PS > 문제 풀이' 카테고리의 다른 글
| [프로그래머스/Swift] 92335번 - k진수에서 소수 개수 구하기 (0) | 2025.02.07 |
|---|---|
| [프로그래머스/Swift] 84512번 - 모음사전 (0) | 2025.02.06 |
| [프로그래머스/Swift] 132265번 - 롤케이크 자르기 (0) | 2025.02.04 |
| [프로그래머스/Swift] 17677번 - [1차] 뉴스 클러스터링 (0) | 2025.02.03 |
| [프로그래머스/Swift] 43165번 - 타켓 넘버 (0) | 2025.02.02 |
