https://school.programmers.co.kr/learn/courses/30/lessons/81302
풀이 및 소스코드
허드슨 거리가 2라면 조건은 해선 안되는 포지션은 아래와 같다
행이 같을경우
POP -> 탈락
열이 같을 경우
P
O
P -> 탈락
행과 열이 다를경우(대각선인경우)
P?
?P -> ?가 하나라도 O일경우 탈락
1차원 String배열로 1개의 맵이 주어지기 때문에 이를 2차원 배열로 바꿔줘야한다.
1개의 1차원배열에 대하여 2차원 Character배열로 바꾼다.
for place in places {
var map = [[Character]]()
for pArr in place{
map.append(Array(pArr))
}
}
이렇게하면 map엔 1개의 위치정보가 담기고 for pArr아래에서 한개의 맵에대한 검사를 할 수 있다.
두개의 배열을 생성해서 검사를 시작한다.
P의 x, y,좌표를 담을 배열 parr과
해당 맵이 거리두기를 지키고 있는지 저장할 isSafe배열이다.
import Foundation
//맨해튼 거리가 2 이하로 앉지말아
//파티션으로 막힌경우 허용
//응시자 P
//빈테이블 O
//파티션 X
func solution(_ places:[[String]]) -> [Int] {
var result = [Int]()
for place in places {
//1차원 지도를 2차원 지도로 변환---
var map = [[Character]]()
for pArr in place{
map.append(Array(pArr))
}
//--------------
var parr = [[Int]]() //P가담긴 x, y,좌표를 담을 배열
var isSafe = true //현재 검사중인 map이 안전수칙을 지키고있는지
for x in 0..<map.count{//x, y의 좌표를 추가
for y in 0..<map[0].count{
if map[x][y] == Character("P"){
parr.append([x, y])
}
}
}
//전체 P를 서로 검사한다.
for start in 0..<parr.count{
if !isSafe { break }
for next in start+1..<parr.count{
let first = parr[start]
let second = parr[next]
let distance = abs(first[0] - second[0]) + abs(first[1] - second[1]) //허드슨
if distance > 2{ continue }
if distance == 1{
isSafe = false
break
}
//거리가 2인경우 검사
if distance == 2{
//행이 같은 경우
if (first[0] == second[0]) {
if map[first[0]][min(first[1], second[1]) + 1] == Character("O"){
isSafe = false
break
}
}else if (first[1] == second[1]) {
//열이 같은경우
if map[min(first[0], second[0]) + 1][first[1]] == Character("O"){
isSafe = false
break
}
}else{
//대각선일경우
if map[first[0]][second[1]] == Character("O") || map[second[0]][first[1]] == Character("O"){
isSafe = false
break
}
}
}
}
}
if isSafe == false{
result.append(0)
}else{
result.append(1)
}
}
return result
}