Swift랑 친해지기/programmers 풀기

[프로그래머스] Summer/Winter Coding(~2018) 방문 길이 (Swift)

데브킹덕 2023. 5. 26. 17:39

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

내 풀이)

1. dirs문자열의 각 문자에 접근해서 위,아래,좌,우 어디로 갈것인지 파악한다.

 

2. 이동하기 전 좌표를 preCoordinate 문자열로 생성하였다. 

이동후 좌표는 postCoordinate문자열로 생성하였다. 

 

3. dirs의 문자가 "U"라면 현재위치 now의 Y좌표인 인덱스 1을 +1한다.

이때 5를 넘어가면  안되니 조건을 걸어줌

"D"는 now의 Y좌표 인덱스 1을 -1한다 -> -5를 넘어가면안됨

"L"는 now의 X좌표 인덱스 1을 -1한다 -> -5를 넘어가면안됨

"R"는 now의 X좌표 인덱스 1을 +1한다 -> 5를 넘어가면안됨

 

4. 연산이 이뤄지고 이동전, 후 좌표가 같으면 -5나 5를 넘어서 이동을 안한것이므로 조건문을 추가해줌

5. 지나간 자리를 담는 passArray에 존재유무를 contains 메서드를 이용하여 확인하고 없으면 추가해줌.

*주의*

00 -> 01 로 이동한 것과 01->00으로 이동한 것은 같은 경로를 이동 것이기때문에 한번만 추가하도록 해야함

 

 

import Foundation

func solution(_ dirs:String) -> Int {
    
    var passArray: [[String]] = [[String]]() //지나간 자리
    var now: [Int] = [0,0] //현재 위치
    var count = 0 //방문 길이
    
    for i in dirs{
        
        let preCoordinate = String(now[0]) + String(now[1])
        switch i{
        case "U":
            if !(now[1] + 1 > 5){
                now[1] += 1
            }
        case "D":
            if !(now[1] - 1 < -5){
                now[1] -= 1
            }
        case "R":
            if !(now[0] + 1 > 5){
                now[0] += 1
            }
        case "L":
            if !(now[0] - 1 < -5){
                now[0] -= 1
            }
        default:
            break
        }
        let postCoordinate = String(now[0]) + String(now[1])
        
        if preCoordinate != postCoordinate{
            let prePostArray: [String] = [preCoordinate,postCoordinate]
            let postPreArray: [String] = [postCoordinate,preCoordinate]
            
            if passArray.contains(prePostArray) || passArray.contains(postPreArray) {
            }
            else{
                passArray.append(prePostArray)
                count += 1
            }
        }
    }
    return count
}