문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/81302
검사했던 부분을 다시 검사해야 하기 때문에 비효율 적이지만,
데이터가 5X5 행렬 5개뿐이라
BFS를 쓰지 않고 풀 수 있을 것 같았다.
def solution(places):
answer=[]
for room in places:
illigal=False
for x in range(4):
for y in range(4):
squere=room[x][y:y+2]+room[x+1][y:y+2] #2X2 사각형 만들기
if (squere.count("P")>=2) and ("O" in squere): #대각선 체크
illigal=True
for x in range(5):
if ("PP" in room[x]) or ("POP" in room[x]): #행 체크
illigal=True
column=''.join([room[i][x] for i in range(5)]) #열 체크
if ("PP" in column) or ("POP" in column):
illigal=True
answer.append(+(not illigal))
return answer
- 대각선으로 앉은 경우
2X2
사각형 안에P가 2개이상, O가 1개이상 존재
하면 거리두기 어긴것.- 가로나 세로의 경우
한 줄 안에 "POP"나 "PP"가 존재
하면 거리두기를 어긴 것.
1. 대각선인 경우
대각선의 경우 거리두기를 어긴 경우, 거리두기를 지킨 경우는 다음과 같다.
거리두기를 어긴 경우의 공통점은
2X2
사각형 안에 "P
"가 2개
그리고 O
가 1개
이상 존재한다는 것이다.
사각형 안에 "P"
가 3개
나 4개
여도 거리두기를 어긴 경우이다.
("PP"
가 필연적으로 존재하기 때문에)
if (squere.count("P")>=2) and ("O" in squere): #대각선 체크
#if (사각형 안에 "P"가 2개 이상 and "O"이 사각형 안에 존재):
illigal=True
따라서 다음과 같이 2X2
사각형의 좌측 상단 기준으로 (0,0)
부터 (3,3)
까지 반복문을 돌면서 P가 2개 이상이고 O가 존재하는지 체크해준다.
(인덱스를 넘어가지 않게 (4,4)
가 아니라 (3,3)
까지만)
2. 가로나 세로인 경우
if ("PP" in room[x]) or ("POP" in room[x]):
illigal=True
"PP"
나 "POP"
가 X번째 행 안에 들어있는지 체크해준다.
열도 같은 방식으로 검사해준다.
column=''.join([room[i][x] for i in range(5)]) #열 체크
if ("PP" in column) or ("POP" in column):
illigal=True
데이터가 적어서 이렇게 풀어도 0.12ms가 최대였다.
심지어 for
문에서 break
도 쓰지 않았었다.