lambda와 sort를 이용해서 좋아하는 학생이 인접한 칸에 가장 많은 칸, 인접한 칸 중에서 비어있는 칸이 가장 많은 칸, 행 번호가 가장 작은 칸, 열 번호가 가장 작은 칸으로 한꺼번에 정렬하였다.
import collections, sys
input = sys.stdin.readline
n = int(input())
likeList = collections.defaultdict(list)
matrix = [[0]*n for _ in range(n)]
x = [1, -1, 0, 0]
y = [0, 0, 1, -1]
for i in range(n**2):
line = list(map(int, input().split()))
for j in range(4):
likeList[line[0]].append(line[1+j])
def cntPos(like, px, py):
friendCnt, emptyCnt = 0, 0
if matrix[px][py] != 0:
return -1, -1
for i in range(4):
nx = x[i] + px
ny = y[i] + py
if nx >= 0 and nx < n and ny >= 0 and ny < n:
if like:
if matrix[nx][ny] in like:
friendCnt += 1
if matrix[nx][ny] == 0:
emptyCnt += 1
return friendCnt, emptyCnt
for student in likeList:
like = likeList[student]
arr = []
for i in range(n):
for j in range(n):
friendCnt, emptyCnt = cntPos(like, i, j)
arr.append([friendCnt, emptyCnt, i, j])
arr.sort(key=lambda x: (-x[0],-x[1], x[2]))
matrix[arr[0][2]][arr[0][3]] = student
result = 0
for i in range(n):
for j in range(n):
likeCnt = 0
for k in range(4):
nx = x[k] + i
ny = y[k] + j
if nx >= 0 and nx < n and ny >= 0 and ny < n:
if matrix[nx][ny] in likeList[matrix[i][j]]:
likeCnt += 1
if likeCnt:
result += 10**(likeCnt-1)
print(result)