반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 방문 길이" 문제를 풀었습니다.
Github
문제 링크
풀이
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
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형