(백준) 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)