1dx = [-1, 1, 0, 0]
2dy = [0, 0, -1, 1]
3def quest(table):
4 table = [list(line) for line in table]
5 for j in range(5):
6 for i in range(5):
7 if table[i][j] == 'P':
8 flag = [False]*4
9 target = []
10 for k in range(4):
11 nx = i+dx[k]
12 ny = j+dy[k]
13 if 0 <= nx < 5 and 0 <= ny < 5:
14 target.append((nx, ny))
15 flag[k] = True
16
17 for x, y in target:
18 if table[x][y] == 'C' or table[x][y] == 'P':
19 return 0
20 if table[x][y] == 'O':
21 table[x][y] = 'C'
22
23 target = []
24 if flag[0] and flag[2] and table[i-1][j] == 'O' and table[i][j-1] == 'O':
25 target.append((i-1, j-1))
26 if flag[0] and flag[3] and table[i-1][j] == 'O' and table[i][j+1] == 'O':
27 target.append((i-1, j+1))
28 if flag[1] and flag[2] and table[i+1][j] == 'O' and table[i][j-1] == 'O':
29 target.append((i+1, j-1))
30 if flag[1] and flag[3] and table[i+1][j] == 'O' and table[i][j+1] == 'O':
31 target.append((i+1, j+1))
32
33 for x, y in target:
34 if table[x][y] == 'P':
35 return 0
36 return 1
37
38def solution(places):
39 answer = []
40 for table in places:
41 answer.append(quest(table))
42 return answer
문제
- 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어진다
- 대기실은 5개이며, 각 대기실은 5X5 크기이다
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리가 2이하로 앉지 말아야 한다
- 단, 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용한다
- ‘P’는 응시자가 앉아있는 자리, ‘O’는 빈테이블, ‘X’는 파티션을 의미한다
- 각 대기실별로 거리두기를 잘 지켰는지 여부를 1차원 배열에 담아 반환하라
- TC
- input
[[“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”]]
- ouput
[1, 0, 1, 1, 1]
- input
해결방법
- 먼저, 응시자의 상하좌우로 ‘C’를 표시하고, 다른 응시자가 ‘C’공간을 침범할 경우 거리두기를 지키지 않은 것으로 판단한다
- 그 다음, 파티션으로 막혀있지 않은 대각선 위치에 다른 응시자가 있다면 거리두기를 지키지 않은 것으로 판단한다
- 거리두기 여부에 따라 quest함수가 0 또는 1을 반환하고, 이를 answer에 담아 반환한다