백준 21608 상어 초등학교

gmlwlswldbs·2021년 10월 15일
0

코딩테스트

목록 보기
50/130
n = int(input())
g = [list(map(int, input().split())) for _ in range(n * n)]
ans = [[-1] * n for _ in range(n)]
ans[1][1] = g[0][0]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def op1(i):
    seatlist = []
    for x in range(n):
        for y in range(n):
            liked = 0
            blank = 0
            if ans[x][y] != -1:
                continue
            for j in range(4):
                nx, ny = x + dx[j], y + dy[j]
                if nx < 0 or ny < 0 or nx >= n or ny >= n:
                    continue
                if ans[nx][ny] in g[i][1:]:
                    liked += 1
                if ans[nx][ny] == -1:
                    blank += 1
            seatlist.append((liked, blank, x, y))    
    return seatlist

for i in range(1, n*n):
    seatlist = op1(i)
    seatlist.sort(reverse=True)
    seatlist2 = []
    liked, blank, x, y = seatlist[0]
    for a, b, c, d in seatlist:
        if a == liked and b == blank:
            seatlist2.append((a, b, c, d))
    if len(seatlist2) == 1:
        a, b, c, d = seatlist2[0]
        ans[c][d] = g[i][0]
        continue
    seatlist2.sort()
    a, b, c, d = seatlist2[0]
    ans[c][d] = g[i][0]
pans = 0
for i in range(n):
    for j in range(n):
        cnt = 0
        for k in range(n*n):
            if g[k][0] == ans[i][j]:
                e = k
                break
        for k in range(4):
            ni, nj = i + dx[k], j + dy[k]
            if ni < 0 or nj < 0 or ni >= n or nj >= n:
                continue
            if ans[ni][nj] in g[e][1:]:
                cnt += 1
        if cnt == 1:
            pans += 1
        elif cnt == 2:
            pans += 10
        elif cnt == 3:
            pans += 100
        elif cnt == 4:
            pans += 1000

print(pans)   

0개의 댓글