📖 문제 링크
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)
'알고리즘 > Python' 카테고리의 다른 글
[백준/Python] 23288번 : 주사위 굴리기 2 (0) | 2022.04.29 |
---|---|
[백준/Python] 21610번: 마법사 상어와 비바라기 (0) | 2022.04.28 |
[백준/Python] 17144번: 미세먼지 안녕! (0) | 2022.04.21 |
[백준/Python] 7562번 : 나이트의 이동 (0) | 2022.04.14 |
[백준/Python] 7576번: 토마토 (JAVA버전 추가) (0) | 2022.04.13 |