알고리즘/Python

[백준/Python] 21608번 : 상어 초등학교

_SIHA_ 2022. 4. 27. 23:25

📖  문제 링크

https://www.acmicpc.net/problem/21608

 

21608번: 상어 초등학교

상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호

www.acmicpc.net

 

 

  최종 코드

 

n = int(input())

student = []
order = []
for i in range(n*n):
    num, a, b, c, d = map(int, input().split())
    student.append([num, a, b, c, d])
    order.append(num)
board = [[0 for _ in range(n)] for _ in range(n)]

    #왼 오 위 아래
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]


def bfs(x, y, stu):
    empty = 0
    like = 0
    for i in range(4):
        
        nx = x + dx[i]
        ny = y + dy[i]
        
        if 0<=nx<n and 0<=ny<n:
            if board[nx][ny] == 0:
                empty += 1
            elif board[nx][ny] in stu:
                like += 1
            
    
    seat.append([x, y, empty, like])
    
    return


def cal(x, y, stu):
    cnt = 0
    for i in range(4):
        
        nx = x + dx[i]
        ny = y + dy[i]
        
        if 0<=nx<n and 0<=ny<n:
            if board[nx][ny] in stu:
                cnt+=1
                
    if cnt == 0:
        result = 0
    elif cnt == 1:
        result = 1
    elif cnt == 2:
        result = 10
    elif cnt == 3:
        result = 100
    elif cnt == 4:
        result = 1000
        
    return result
    

visited = [[0 for _ in range(n)] for _ in range(n)]

for l in range(len(student)):
    seat = []
    for i in range(n):
        for j in range(n):
            if board[i][j] == 0:
                bfs(i, j, student[l])   
    
         
    seat.sort(key = lambda x : (-x[3], -x[2], x[0],x[1]))
    
    x, y, empty, like = seat[0]
    board[x][y] = student[l][0]

result = 0

# 호감도 계산
for i in range(n):
    for j in range(n):
        result += cal(i, j, student[order.index(board[i][j])])


print(result)