Closed
Description
💬 문제
[코딩테스트 연습 - 방문 길이](https://school.programmers.co.kr/learn/courses/30/lessons/49994)
💬 Idea
- 방문 라인을 파악할 수 있도록 좌표의 점, 선을 모두 갖는 새로운 board를 만든다.
-
배열 인덱스를 활용할 수 있게끔 - 좌표를 쓰지 않기 위해 출발점을 가운데인 (10, 10)으로 두고, 방문 기록을 담을 21x21 크기의 Bool형 2차원 배열을 만든다.
-
10,10 에서 출발
- departure(출발지)를 기준으로 방문 선은 +1의 값을 가지고, 도착 좌표는 +2의 값을 가진다.
- 즉, 좌표들은 서로 (2,2)만큼 떨어져 있다고 가정하였다.
- 좌표에서 +-1의 값은 선이 된다.
- x, y 좌표의 이동
R, L
(오른쪽, 왼쪽)은x좌표
간의 이동을 뜻하므로 departure, visitLine 배열의 0번 인덱스가 변경될 수 있도록 dirDict에 0의 값을 저장해주었다.U, D
(위, 아래)는y좌표
간의 이동을 뜻하므로 departure, visitLine 배열의 1번 인덱스가 변경될 수 있도록 dirDict에 1의 값을 저장해주었다.
- 좌표계의 음, 양의 이동
- U, R은 좌표계에서 양의 이동을 뜻한다. 따라서 좌표평면의 경계를 넘어가는 명령어를 무시하기 위해 departure[s] + 2 <= 20 이라는 조건을 두었다.
1. 이후 다음 출발점이 될 좌표인 departure에는 +2,
2. 방문한 선이 될 visitLine에는 +1을 해주었다. - D, L은 좌표계에서 음의 이동을 뜻한다. 따라서 좌표평면의 경계를 넘어가는 명령어를 무시하기 위해 departure[s] - 2 >= 0 이라는 조건을 두었다.
1. 이후 다음 출발점이 될 좌표인 departure에는 -2,
2. 방문한 선이 될 visitLine에는 -1을 해주었다.
- 결과 도출
- board[visitLine[0]][visitLine[1]] 좌표가 최초 방문된 좌표라면(false) 결과 값에 +1 을 한다.
- 이후 board[visitLine[0]][visitLine[1]] 좌표를 방문처리 한다.
💬 풀이
func solution(_ dirs: String) -> Int {
var board: [[Bool]] = Array(repeating: Array(repeating: false, count: 21), count: 21)
let dirDict: [String: Int] = ["U": 1, "R": 0, "D": 1, "L": 0]
var departure = [10, 10], visitLine = [10, 10]
var result = 0
for i in dirs {
let s = dirDict[String(i)]!
if i == "U" || i == "R" {
if departure[s] + 2 <= 20 {
visitLine = departure
departure[s] += 2
visitLine[s] += 1
}
} else {
if departure[s] - 2 >= 0 {
visitLine = departure
departure[s] -= 2
visitLine[s] -= 1
}
}
result += board[visitLine[0]][visitLine[1]] == false ? 1 : 0
board[visitLine[0]][visitLine[1]] = true
}
return result
}