코딩테스트

[Swift 알고리즘] 프로그래머스(Lv.2) - 방문 길이

유정주 2022. 5. 3. 10:11
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "프로그래머스(Lv.2) - 방문 길이" 문제를 풀었습니다.

 


Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

 


풀이

1. 범위를 넘지 않으면 이동

명령어를 읽으면서 범위를 넘지 않으면 로봇을 이동합니다.

 

2. 간 적 없는 길이면 카운트

로봇이 간 적이 없는 길이라면 배열에 넣고 카운트 합니다.

배열에 넣는 이유는 이미 간 곳인지 확인을 해야 하기 때문입니다.

 

저는 Move 구조체를 정의했는데요. x, y, 다음 x, 다음 y를 가지고 있습니다.

이동할 때마다 Move 배열에 동일한 아이템이 있는지 확인합니다.

이때 X -> Y와 Y -> X는 같은 길을 이용하는 것이기 때문에 주의하셔야 합니다.

 

후기

이번 문제는 같은 길로 되돌아오는 경우를 생각할 수 있느냐에서 갈릴 것 같습니다.

문제의 예시만으로는 파악하기 힘들기 때문에 제출했을 때 많이 틀린다면 이 부분을 살펴보세요.

 

감사합니다!


전체 코드

import Foundation

struct Move {
    var x: Int
    var y: Int
    var nx: Int
    var ny: Int
}

func contains(_ roads: [Move], _ newRoad: Move) -> Bool {
    for road in roads {
        //같은 길로 가는 경우
        if road.x == newRoad.x && road.y == newRoad.y && 
            road.nx == newRoad.nx && road.ny == newRoad.ny {
            return true
        }
         
        //같은 길로 오는 경우
        if road.x == newRoad.nx && road.y == newRoad.ny && 
            road.nx == newRoad.x && road.ny == newRoad.y {
            return true
        } 
    }
    
    return false
}

func solution(_ dirs:String) -> Int {
    let size = 11
    var roads: [Move] = []
    var x = 5, y = 5
        
    for dir in dirs {
        let prevX = x, prevY = y
        
        //범위에 맞으면 명령어 실행
        switch dir {
            case "U": if x-1 >= 0 { x -= 1 }
            case "D": if x+1 <= size-1 { x += 1 }
            case "R": if y+1 <= size-1 { y += 1 }
            case "L": if y-1 >= 0 { y -= 1 }
            default: break
        }
        
        //제자리면 continue 
        if prevX == x && prevY == y {
            continue
        }
        
        //간 적 없는 길이면 길 추가
        let road = Move(x: prevX, y: prevY, nx: x, ny: y)
        if !contains(roads, road) {
            roads.append(road)
        }
    }

    // print(roads)
    
    return roads.count
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형