알고리즘/알고리즘 문제풀이
카카오_프로그래머스_거리두기 확인하기 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
문제접근
- 각 대기실의 거리두기 평가를 시행
- 대기실의 데이터를 행렬로 변환치 아니하고, 2중 반복을 사용하여 P,X의 좌표를 각각 참여자들, 파티션 Array에 추가.
- 각 참여자 상호간의 맨해튼거리를 연산, 2이하일 경우, 좌표 관계( 같은 행, 같은 열, 대각선 여부)에 따른 파티션 유무 확인
- 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
}