Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Algorithm] 방문 길이 #44

Closed
hwangJi-dev opened this issue Dec 31, 2022 · 0 comments
Closed

[Algorithm] 방문 길이 #44

hwangJi-dev opened this issue Dec 31, 2022 · 0 comments

Comments

@hwangJi-dev
Copy link
Owner

hwangJi-dev commented Dec 31, 2022

💬 문제

[코딩테스트 연습 - 방문 길이](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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant