알고리즘/알고리즘 문제풀이

카카오_프로그래머스_거리두기 확인하기 swift

Downey 2022. 2. 21. 15:35

https://programmers.co.kr/learn/courses/30/lessons/81302?language=swift 

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

 

문제접근

  1. 각 대기실의 거리두기 평가를 시행
  2. 대기실의 데이터를 행렬로 변환치 아니하고, 2중 반복을 사용하여 P,X의 좌표를 각각 참여자들, 파티션 Array에 추가.
  3. 각 참여자 상호간의 맨해튼거리를 연산, 2이하일 경우, 좌표 관계( 같은 행, 같은 열, 대각선 여부)에 따른 파티션 유무 확인
  4. 3에 따른 결과를 Array에 append해 return.

성능

더보기
테스트 1 통과 (0.23ms, 16.2MB)
테스트 2 통과 (0.18ms, 16.4MB)
테스트 3 통과 (0.18ms, 16.3MB)
테스트 4 통과 (0.19ms, 16.4MB)
테스트 5 통과 (0.16ms, 16.4MB)
테스트 6 통과 (0.25ms, 16.4MB)
테스트 7 통과 (0.17ms, 16.4MB)
테스트 8 통과 (0.27ms, 16.3MB)
테스트 9 통과 (0.17ms, 16.4MB)
테스트 10 통과 (0.17ms, 16.3MB)
테스트 11 통과 (0.17ms, 16.3MB)
테스트 12 통과 (0.17ms, 16.5MB)
테스트 13 통과 (0.16ms, 16.3MB)
테스트 14 통과 (0.16ms, 16.3MB)
테스트 15 통과 (0.18ms, 16.3MB)
테스트 16 통과 (0.20ms, 16.4MB)
테스트 17 통과 (0.18ms, 16.1MB)
테스트 18 통과 (0.16ms, 16.4MB)
테스트 19 통과 (0.16ms, 16.3MB)
테스트 20 통과 (0.18ms, 16.2MB)
테스트 21 통과 (0.18ms, 16.3MB)
테스트 22 통과 (0.18ms, 16.4MB)
테스트 23 통과 (0.14ms, 15.9MB)
테스트 24 통과 (0.15ms, 16.2MB)
테스트 25 통과 (0.10ms, 16.4MB)
테스트 26 통과 (0.14ms, 16.3MB)
테스트 27 통과 (0.20ms, 16MB)
테스트 28 통과 (0.22ms, 16.4MB)
테스트 29 통과 (0.25ms, 16MB)
테스트 30 통과 (0.16ms, 16.1MB)

 

정답 코드

더보기
import Foundation


func solution(_ places:[[String]]) -> [Int] {
    
    func manhattanDistance(_ lhs: [Int], _ rhs: [Int]) -> Int {
        return abs(lhs[0]-rhs[0]) + abs(lhs[1]-rhs[1])
    }
    
    func isKeepDistance(_ input: [String]) -> Int {
        var participants: [[Int]] = []
        var partition: [[Int]] = []
        
        for (i, str) in input.enumerated() {
            for (ii,char) in str.enumerated() {
                switch char {
                case "P":
                    participants.append([i,ii])
                case "X":
                    partition.append([i,ii])
                default:
                    continue
                }
            }
        }
        
        for i in 0..<participants.count {
            for ii in i+1..<participants.count {
                let lhs = participants[i]
                let rhs = participants[ii]
                let distance = manhattanDistance(lhs, rhs)
                
                if distance <= 2 {
                    if lhs[0] == rhs[0] &&
                        !partition.contains([lhs[0],(lhs[1] + rhs[1]) / 2]) { // 같은 행
                            return 0
                    } else if lhs[1] == rhs[1] &&
                        !partition.contains([(lhs[0] + rhs[0]) / 2, lhs[1]]) {
                            return 0
                    } else if (lhs[0] != rhs[0]) &&
                                (lhs[1] != rhs[1]) &&
                                (!partition.contains([lhs[0],rhs[1]]) ||
                                !partition.contains([rhs[0],lhs[1]])) {
                            return 0
                    }
                }
            }
        }
        
        return 1
    }
    
    var ans : [Int] = []
    for place in places {
        let result = isKeepDistance(place)
        ans.append(result)
    }
    
    return ans
}