Skip to content

[Algorithm] 방문 길이 #44

Closed
Closed
@hwangJi-dev

Description

@hwangJi-dev

💬 문제

[코딩테스트 연습 - 방문 길이](https://school.programmers.co.kr/learn/courses/30/lessons/49994)


💬 Idea

  • 방문 라인을 파악할 수 있도록 좌표의 점, 선을 모두 갖는 새로운 board를 만든다.

IMG_E0CF2064E94E-1

  1. 배열 인덱스를 활용할 수 있게끔 - 좌표를 쓰지 않기 위해 출발점을 가운데인 (10, 10)으로 두고, 방문 기록을 담을 21x21 크기의 Bool형 2차원 배열을 만든다.

  2. 10,10 에서 출발

  • departure(출발지)를 기준으로 방문 선은 +1의 값을 가지고, 도착 좌표는 +2의 값을 가진다.
  • 즉, 좌표들은 서로 (2,2)만큼 떨어져 있다고 가정하였다.
  • 좌표에서 +-1의 값은 선이 된다.
  1. x, y 좌표의 이동
  • R, L(오른쪽, 왼쪽)은 x좌표간의 이동을 뜻하므로 departure, visitLine 배열의 0번 인덱스가 변경될 수 있도록 dirDict에 0의 값을 저장해주었다.
  • U, D(위, 아래)는 y좌표간의 이동을 뜻하므로 departure, visitLine 배열의 1번 인덱스가 변경될 수 있도록 dirDict에 1의 값을 저장해주었다.
  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을 해주었다.
  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
}

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions