https://www.acmicpc.net/problem/21608
if __name__ == "__main__":
n = int(input())
students = [list(map(int,input().split())) for _ in range(n*n)]
res = [[0] * n for _ in range(n)]
dx = [1,-1,0,0]
dy =[0,0,1,-1]
for idx in range(n*n):
student = students[idx]
tmp = []
for i in range(n):
for j in range(n):
if res[i][j] == 0:
friend = 0
empty = 0
for k in range(4):
x = i + dx[k]
y = j + dy[k]
if 0<=x<n and 0<=y<n:
if res[x][y] in student[1:]:
friend +=1
if res[x][y] == 0:
empty +=1
tmp.append([friend,empty,i,j])
tmp.sort(key = lambda x: (-x[0],-x[1],x[2],x[3]))
res[tmp[0][2]][tmp[0][3]] = student[0]
total = 0
students.sort(key = lambda x: x[0])
for i in range(n):
for j in range(n):
cnt = 0
for k in range(4):
x = i + dx[k]
y = j + dy[k]
if 0<=x<n and 0<=y<n:
if res[x][y] in students[res[i][j]-1][1:]:
cnt +=1
if cnt != 0:
total += 10 ** (cnt -1)
print(total)
구현 문제이다. 문제를 잘 읽고 하라는 대로 하면 된다.
조건은 다음과 같다.
1. 인접한 곳에 좋아하는 친구가 많은지 체크한다.
2. 1의 조건이 같다면 인접한 곳이 빈곳이 많은지 체크한다.
3. 2,1의 조건이 같다면 행이 작은 것, 열이 작은 것 순으로 선택한다.
1,2를 한번에 체크한 후 (친구수,빈칸,행,열) 순으로 정렬을 통해서 0 번째를 출력하면 된다.
어렵게 생각하지말기 꼬아서 생각하지 않기