반응형

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

 

오늘은 "프로그래머스(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
}

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

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

공감 댓글 부탁드립니다.

 

 

반응형
유정주