본문 바로가기
Study/Coding Test

[백준] 21608 - 상어 초등학교 Python

by 들숨날숨흡 2023. 8. 11.
728x90

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

 

21608번: 상어 초등학교

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

www.acmicpc.net

import sys
from collections import defaultdict

input = sys.stdin.readline

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
sum = 0

N = int(input())

seat = [[0] * (N + 1) for _ in range(N + 1)]

student = defaultdict(list)

for _ in range(N ** 2):
    info = list(map(int, input().split()))
    student_num = info[0]
    student_like = info[1:]
    student[student_num] = student_like

    #앉을 수 있는 자리 후보군
    able = []

    for x in range(1, N + 1):
        for y in range(1, N + 1):
            if seat[x][y] == 0:
                like = 0
                empty = 0
                for k in range(4):
                    nx = x + dx[k]
                    ny = y + dy[k]
                    if 1 <= nx < N + 1 and 1 <= ny < N + 1:
                        if seat[nx][ny] == 0:
                            empty += 1
                        if seat[nx][ny] in student[student_num]:
                            like += 1
                able.append((like, empty, x, y))
    able = sorted(able, key = lambda x : (-x[0], -x[1], x[2], x[3]))
    seat[able[0][2]][able[0][3]] = student_num

for i in range(1, N + 1):
    for j in range(1, N + 1):
        count = 0
        for k in range(4):
            nx = i + dx[k]
            ny = j + dy[k]
            if 1 <= nx < N + 1 and 1 <= ny < N + 1:
                if seat[nx][ny] in student[seat[i][j]]:
                    count += 1

        if count != 0:
            sum += 10 ** (count - 1)

print(sum)
728x90