https://www.acmicpc.net/problem/21608
21608번: 상어 초등학교
상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호
www.acmicpc.net
문제요약:
n*n 2차원 배열에 학생과 좋아하는 학생의 숫자를 열거한다. 열거 후
위 규칙순으로 자리를 배치 할 때, 학생들의 만족도(근처에 있는 좋아하는 학생수로 결정)의 합을 구하여라
소요시간:
35분
난이도:
골드5
제출횟수 :
1회
코딩:
import sys
input = sys.stdin.readline
n = int(input())
students= [list(map(int,input().split())) for _ in range(n**2)]
arr= [[0]*n for _ in range(n)]
dy = [-1,0,1,0]
dx = [0,1,0,-1]
fav = dict()
for student in students:
#자리 후보
chair = []
fav[student[0]] = set(student[1:])
student = student[0]
for y in range(n):
for x in range(n):
#이미 차있으면 아웃
if arr[y][x]:
continue
#임시
f_num = 0
b_num = 0
for i in range(4):
ny = y+dy[i]
nx = x+dx[i]
if 0<=ny<n and 0<=nx<n:
#주변에 fav가 있으면
if arr[ny][nx] in fav[student]:
f_num+=1
#비어있으면
if arr[ny][nx] == 0 :
b_num+=1
chair.append([f_num,b_num,y,x])
#주어진 조건에 따라 중요도 순서로 순서배치
chair.sort(key = lambda x:(-x[0],-x[1],x[2],x[3]))
f,b,y,x = chair[0]
arr[y][x] = student
result = 0
for y in range(n):
for x in range(n):
f = 0
for i in range(4):
ny = y+dy[i]
nx = x+dx[i]
if 0<=ny<n and 0<=nx<n:
if arr[ny][nx] in fav[arr[y][x]]:
f+=1
if f!=0:
result +=10**(f-1)
print(result)
매인 알고리즘은 정렬 이지만, 구현문제에 더 가까운 문제라고 생각합니다. 먼저 나중에 만족도를 구할때 특정학생의 좋아하는 학생리스트를 구하기위해 미리 dict함수로 선언해주었고, 포문을 돌며 비어있지 않은 곳 중에서 주변 좋아하는 학생의 수 ,주변에 비어있는 자리수를 구해준뒤, 우선순위에 따라 정렬해주고 가장 우선순위에 있는것을 채택 했습니다. 그 후, 조건에 따라 호감도를 계산해주었습니다.