문제
https://programmers.co.kr/learn/courses/30/lessons/81302
코딩테스트 연습 - 거리두기 확인하기
[["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
내 풀이
대기실에서 'P'의 좌표를 따로 저장한다.
'P' 간의 거리를 구하기 위해 두 개씩 짝을 만든다.
두 개의 좌표 간의 맨해튼 거리가 2 이하인 경우, 좌표의 위치가 어떻게 생겼는지에 따라 4가지 경우로 나눈다.
4가지 경우 안에서 해당하는 경우를 찾고 답을 구한다. 주석을 보면 더 이해하기 쉽다.
def solution(places):
answer = []
for place in places:
people = []
for i in range(5):
for j in range(5):
if place[i][j] == 'P':
people.append((i, j))
flag = True
for i in range(len(people)-1):
for j in range(i+1, len(people)):
ax, ay = people[i]
bx, by = people[j]
if abs(ax-bx) + (abs(ay-by)) <= 2:
# PXP
if ax-bx == 0 and place[ax][max(ay, by)-1] != 'X':
flag = False
# P
# X
# P
elif ay-by == 0 and place[max(ax, bx)-1][ay] != 'X':
flag = False
# PX
# XP
elif (ax < bx and ay < by and (place[ax][ay+1] != 'X' or place[bx][by-1] != 'X')) or (bx < ax and by < ay and (place[bx][by+1] != 'X' or place[ax][ay-1] != 'X')):
flag = False
# XP
# PX
elif (ax < bx and ay > by and (place[ax][ay-1] != 'X' or place[bx][by+1] != 'X')) or (bx < ax and by > ay and (place[bx][by-1] != 'X' or place[ax][ay+1] != 'X')):
flag = False
if not flag:
answer.append(0)
break
if flag:
answer.append(1)
return answer
총평
반드시 빠지는 조건이 없도록 해야 한다.
'알고리즘 > 카카오 EASY' 카테고리의 다른 글
튜플 (Level 2) (0) | 2022.07.04 |
---|---|
수식 최대화 (Level 2) (0) | 2022.07.04 |
뉴스 클러스터링 (Level 2) (0) | 2022.06.28 |
실패율 (Level 1) (0) | 2022.06.28 |
괄호 변환 (Level 2) (0) | 2022.06.25 |