티스토리 뷰

문제

https://school.programmers.co.kr/learn/courses/30/lessons/49994

풀이

  • 입력의 최대 이동이 500이므로 단순 반복으로 풀리는 문제
  • check함수를 통해서 경로로 이동한적있는지 확인
  • 주의 사항
    1. 좌표 평면을 넘어가는 경우 처리
    2. (x1,y1) → (x2,y2) 로 가는 경우 경로는 그 반대인 (x2,y2) → (x1,y1) 도 체크 해줘야 한다 ( 이 문제에서 길은 양방향이기 때문)
    3. 결과를 반환할때 경로를 양쪽에서 넣었기 때문에 개수 / 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
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함