본문 바로가기

About/Algorithm

[Programmers] 거리두기 확인하기 (Python 풀이)

https://programmers.co.kr/learn/courses/30/lessons/81302#fn1

 

코딩테스트 연습 - 거리두기 확인하기

[["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' 사이의 맨해튼 거리가 2이하인 경우 파티션 여부를 확인하여 거리두기가 잘 이루어졌는지 확인하는 문제입니다.

거리가 2이하이나 거리두기가 잘 이루지지 않은 경우는 다음과 같습니다.

  1. 'P' 사이의 거리가 1인 경우(두 사람 사이에 파티션이 존재할 수 없음)
    ex) PP  P
                P
  2. 거리가 2이며, 행이 같으나 두 'P' 사이의 열에 파티션('O')이 없는 경우
    ex) PXP
  3. 거리가 2이며, 열이 같으나 두 'P' 사이의 행에 파티션이 없는 경우
    ex) P
          X
          P
  4. 거리가 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(5for x in range(5if 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'들 사이 좌표에 파티션이 있는지 모두 확인합니다.