[프로그래머스 LV2] 거리두기 확인하기

Junyoung Park·2022년 6월 11일
0

코딩테스트

목록 보기
462/631
post-thumbnail

1. 문제 설명

거리두기 확인하기

2. 문제 분석

행렬 그래프를 BFS를 통해 탐색, 특정 노드까지 걸리는 최소 거리 값을 얻어낼 수 있다. 모든 사람 (값이 P)을 시작 노드로 설정한 BFS를 돌리자. 한 번이라도 맨해튼 거리가 2 이하인 다른 사람과 만난다면 거리두기를 지키지 않은 것이므로 그 시점에서 곧바로 리턴시켜야 한다.

  • 깔끔하게 풀기 위해 각 역할에 따라 함수를 분리하려고 노력했다! 스위프트 문자열 배열은 귀찮다는 것도... 문제를 풀 때 고려할 점.

3. 나의 풀이

import Foundation

let dx = [1, -1, 0, 0]
let dy = [0, 0, 1, -1]

func solution(_ places:[[String]]) -> [Int] {
    var result = [Int]()
    for place in places {
        result.append(BFS(place:place))
    }
    return result
}

func BFS(place: [String]) -> Int {
    var nodes = [[String]]()
    for p in place {
        let line = Array(p.map{String($0)})
        nodes.append(line)
    }
    
    let people = getInfo(nodes: nodes)
    
    for person in people {
        let (row, col) = (person.0, person.1)
        var queue = [(Int, Int, Int)]()
        queue.append((row, col, 0))
        var index = 0
        var visited = Array(repeating: Array(repeating: false, count: 5), count: 5)
        visited[row][col] = true
        
        while queue.count > index {
            let curData = queue[index]
            let curRow = curData.0
            let curCol = curData.1
            let curCost = curData.2
            
            for idx in 0..<4 {
                let nextRow = curRow + dy[idx]
                let nextCol = curCol + dx[idx]
                
                if nextRow < 0 || nextCol < 0 || nextRow >= 5 || nextCol >= 5 {
                    continue
                }
                
                if nodes[nextRow][nextCol] != "X" && visited[nextRow][nextCol] == false {
                    
                    if nodes[nextRow][nextCol] == "P" && curCost + 1 <= 2 {
                        return 0
                    }
                    
                    visited[nextRow][nextCol] = true
                    queue.append((nextRow, nextCol, curCost + 1))
                }
            }
            index += 1
        }
    }
    return 1
}

func getInfo(nodes: [[String]]) -> [(Int, Int)] {
    var people = [(Int, Int)]()
    
    for i in 0..<nodes.count {
        let line = nodes[i]
        for j in 0..<line.count {
            if nodes[i][j] == "P" {
                people.append((i, j))
            }
        }
    }
    return people
}
profile
JUST DO IT

0개의 댓글