💬 문제
https://school.programmers.co.kr/learn/courses/30/lessons/81302?language=swift
💬 Idea
- 맨해튼 거리가 2 이하인 조건에 부합하는 경우라면 0을, 그렇지 않다면 1을 반환해주자.
<맨해튼 거리가 2 이하인 조건>
인덱스 (y, x)에 P가 있다고 할 때
- 같은 row(행)에 거리가 2 이하인 곳에 P가 있을 때
- 거리가 1인곳에 P가 있다면 파티션 체크할 필요 없이 false
- 거리가 2인 곳이라면
- 가운데에 파티션이 있는지 체크하고 없다면 false
- 같은 col(열)에 거리가 +- 2 이하인 곳에 P가 있을 때
- 좌상 좌하 우상 우하 대각선에 P가 있을 때
- P X
X P - X P
P X - 해당 2개의 형태가 아니라면 false
💬 풀이
import Foundation
func solution(_ places:[[String]])->[Int]{varans:[Int]=[]foriin places {varplaceArr:[[String]]=[]
i.forEach({ placeArr.append(Array($0).map({String($0)}))})varisRightDistance=truefor(iIdx, i)in placeArr.enumerated(){for(jIdx, j)in i.enumerated(){if j =="P"{if !findIfDiaKeepDistance((iIdx, jIdx), placeArr) || !findIfColKeepDistance((iIdx, jIdx), placeArr) || !findIfRowKeepDistance((iIdx, jIdx), placeArr){
isRightDistance =falsebreak}}}}
ans.append(isRightDistance ?1:0)}return ans
}
// Row (Int, Int)에서 0: y, 1: x
func findIfRowKeepDistance(_ idx:(Int,Int), _ places:[[String]])->Bool{
// 사이에 X 벽이 있을 수 없음
if idx.1+1<=4{ifplaces[idx.0][idx.1+1]=="P"{returnfalse}}if idx.1-1>=0{ifplaces[idx.0][idx.1-1]=="P"{returnfalse}}if idx.1+2<=4{ifplaces[idx.0][idx.1+2]=="P" && places[idx.0][idx.1+1]!="X"{returnfalse}}if idx.1-2>=0{ifplaces[idx.0][idx.1-2]=="P" && places[idx.0][idx.1-1]!="X"{returnfalse}}returntrue}
// Column
func findIfColKeepDistance(_ idx:(Int,Int), _ places:[[String]])->Bool{
// 사이에 X 벽이 있을 수 없음
if idx.0+1<=4{ifplaces[idx.0+1][idx.1]=="P"{returnfalse}}if idx.0-1>=0{ifplaces[idx.0-1][idx.1]=="P"{returnfalse}}if idx.0+2<=4{ifplaces[idx.0+2][idx.1]=="P" && places[idx.0+1][idx.1]!="X"{returnfalse}}if idx.0-2>=0{ifplaces[idx.0-2][idx.1]=="P" && places[idx.0-1][idx.1]!="X"{returnfalse}}returntrue}
// Diagonal
func findIfDiaKeepDistance(_ idx:(Int,Int), _ places:[[String]])->Bool{if idx.0+1<=4 && idx.1+1<=4{
// 우하
ifplaces[idx.0+1][idx.1+1]=="P"{ifplaces[idx.0][idx.1+1]!="X" || places[idx.0+1][idx.1]!="X"{returnfalse}}}if idx.0-1>=0 && idx.1-1>=0{
// 좌상
ifplaces[idx.0-1][idx.1-1]=="P"{ifplaces[idx.0-1][idx.1]!="X" || places[idx.0][idx.1-1]!="X"{returnfalse}}}if idx.0+1<=4 && idx.1-1>=0{
// 좌하
ifplaces[idx.0+1][idx.1-1]=="P"{ifplaces[idx.0][idx.1-1]!="X" || places[idx.0+1][idx.1]!="X"{returnfalse}}}if idx.0-1>=0 && idx.1+1<=4{
// 우상
ifplaces[idx.0-1][idx.1+1]=="P"{ifplaces[idx.0-1][idx.1]!="X" || places[idx.0][idx.1+1]!="X"{returnfalse}}}returntrue}소요시간 : 1시간 30분
💬 문제https://school.programmers.co.kr/learn/courses/30/lessons/81302?language=swift
💬 Idea<맨해튼 거리가 2 이하인 조건>
인덱스 (y, x)에 P가 있다고 할 때
X P
P X
💬 풀이소요시간: 1시간 30분