https://programmers.co.kr/learn/courses/30/lessons/81302#fn1
이 문제는 거리가 'P' 사이의 맨해튼 거리가 2이하인 경우 파티션 여부를 확인하여 거리두기가 잘 이루어졌는지 확인하는 문제입니다.
거리가 2이하이나 거리두기가 잘 이루지지 않은 경우는 다음과 같습니다.
- 'P' 사이의 거리가 1인 경우(두 사람 사이에 파티션이 존재할 수 없음)
ex) PP P
P - 거리가 2이며, 행이 같으나 두 'P' 사이의 열에 파티션('O')이 없는 경우
ex) PXP - 거리가 2이며, 열이 같으나 두 'P' 사이의 행에 파티션이 없는 경우
ex) P
X
P - 거리가 2이며, 행/열이 모두 다르고 두 'P'의 사이에 파티션이 모두 없는 경우
ex) PX XP PO PX
XP PX XP OP
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
def check_distance(place):
# 'P' 값의 좌표만 plist에 추가함.
plist = [(y, x) for y in range(5) for x in range(5) if place[y][x] == 'P']
# 각 좌표끼리 거리를 계산하고, 거리에 따라 거리두기 여부 판단
for y, x in plist:
for y2, x2 in plist:
dist = abs(y-y2) + abs(x-x2) # 맨해튼 거리
if dist == 0 or dist > 2: # 같은 좌표이거나 거리가 2이상인 경우 continue
continue
if dist == 1: # 두 사람 사이의 거리가 1인 경우
return 0
elif y == y2 and place[y][int((x+x2)/2)] != 'X': # 열이 같으나 두 사람 사이에 파티션이 없는 경우
return 0
elif x == x2 and place[int((y+y2)/2)][x] != 'X': # 행이 같으나 두 사람 사이에 파티션이 없는 경우
return 0
elif y != y2 and x != x2: # 열/행이 다른경우(대각선), 두 사람 사이 파티션이 없는 경우
if place[y2][x] != 'X' or place[y][x2] != 'X':
return 0
return 1
def solution(places):
answer = []
# 각 place들을 check_distance함수로 조사
for place in places:
answer.append(check_distance(place))
return answer
|
cs |
- 3번 라인 : place에서 'P'의 좌표만 가져와서 구성합니다.
- 6~20번 라인 : 각 'P'의 좌표를 비교하여 거리가 2이하인 경우에만 거리두기를 조사합니다. (거리가 0인 경우 동일 좌표입니다.)
- 12~20번 라인 : 두 좌표를 조사해서(위의 경우 참고) 거리두기가 잘 이루어지지 않은 경우 0을 반환합니다.
- 19~20번 라인 : (y, x), (y2,x2) 좌표에서 (y, x2), (y2, x) 좌표를 확인하여 대각선으로 이루어진 'P'들 사이 좌표에 파티션이 있는지 모두 확인합니다.
'About > Algorithm' 카테고리의 다른 글
[백준 18119] 단어 암기 (C) (0) | 2023.01.31 |
---|---|
[백준 2309] 일곱 난쟁이 (c++) (0) | 2022.09.05 |
[Programmers] 기능개발 (Python 풀이) (2) | 2022.06.02 |
[Programmers] 이중우선순위큐 (Python 풀이) (2) | 2022.06.02 |
[Programmers] 빛의 경로 사이클 (Python 풀이) (2) | 2022.06.02 |