(백준) 21608 상어초등학교 – 파이썬

#21608: 상어초등학교(acmicpc.net)

– 삼성의 이전 이슈는 대부분 구현 이슈이고 코드가 길기 때문에 헷갈리지 않도록 주석이나 메모로 이어가는 것이 좋습니다.

|r하나 -아르 자형2| + |c하나 -씨2| = 1 => 인접 셀(위, 아래, 왼쪽, 오른쪽)

– 받아쓰기에서 자신의 수험번호(키)와 좋아하는 수험번호(값)를 받아 정리하세요.

※ Python 3.6 버전부터 dict에 순서가 있습니다. 대부분의 코딩 테스트는 파이썬 버전 3.6 이상을 사용하기 때문에 사용해도 상관없지만 만일을 대비해 버전을 확인하고 사용하는 것이 좋을 것이다.

– 각 학생의 형식(좋아하는 사람 수, 무료 사각형, 행, 열)의 모든 사각형을 검토하고 구성합니다.

– 조건 1, 2, 3의 우선 순위에 따라 정렬하여 인덱스 0에 위치를 지정합니다. (가장 많은 기준을 충족하는 좌석)

– 모두 착석 후 만족도 체크

import sys
input = sys.stdin.readline

N = int(input())

students = dict()    # 학생의 번호 : (좋아하는 학생의 번호)
for _ in range(N**2):
    temp = list(map(int, input().split()))
    students(temp(0)) = temp(1:)

classroom = ((0)*N for _ in range(N))    # 교실

dy = (-1, 1, 0, 0)
dx = (0, 0, -1, 1)

for num in students:
    possible = ()    # 현재 학생(num)이 앉을 수 있는 좌석
    for i in range(N):
        for j in range(N):
            if classroom(i)(j) != 0:    # 자리가 비어있지 않으면 pass
                continue

            fav = 0    # 인접한 칸에 좋아하는 학생이 있는 수
            emp = 0    # 인접한 칸이 비어있는 수
            for k in range(4):    # 인접한 칸 확인
                y, x = i + dy(k), j + dx(k),
                if 0 <= y < N and 0 <= x < N:    # 교실 좌석 범위 내에 체크
                    if classroom(y)(x) in students(num):    # 좋아하는 학생 목록에 존재하는 경우
                        fav += 1
                    elif classroom(y)(x) == 0:    # 비어있는 경우
                        emp += 1
            possible.append((fav, emp, i, j))    # possible에 추가

    possible.sort(key=lambda x: (-x(0), -x(1), x(2), x(3)))    # 조건 1,2,3을 만족하는 순서대로 정렬

    classroom(possible(0)(2))(possible(0)(3)) = num    # 조건을 가장 만족하는 위치에 자리하기

answer = 0
satisfaction = {0: 0, 1: 1, 2: 10, 3: 100, 4: 1000}    # 인접한 칸에 좋아하는 학생의 수에 따른 만족도
for i in range(N):
    for j in range(N):
        cnt = 0
        for k in range(4):
            y, x = i + dy(k), j + dx(k),
            if 0 <= y < N and 0 <= x < N:
                if classroom(y)(x) in students(classroom(i)(j)):
                    cnt += 1    # 인접한 칸에 좋아하는 학생이 존재한다면 카운트

        answer += satisfaction(cnt)    # answer에 만족도 누적

print(answer)