보글보글 개발일지
반응형

문제

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

 

21608번: 상어 초등학교

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

www.acmicpc.net

풀이

처음에는 일일히 다 구현하느라 힘들어 죽는줄알았는데... 분명 잘 했는데... 맞왜틀? 이라서 그냥 해설을 봤다..

알고보니 한 번에 좋아하는 학생수, 비어있는 칸을 계산해두고 정렬을 하는 문제였다.

그리고

candidate = sorted(candidate, key=lambda x:(-x[0],-x[1],x[2],x[3]))

여기서 sorted는 정렬을 해서 candidate에 새로 담아야한다. 안담으면 그냥 정렬해보고 끝...

코드

from collections import deque

n = int(input())
n2 = n * n
arr = []
board = [[0]*n for _ in range(n)]
for _ in range(n2):
    a,b,c,d,e = map(int,input().split())
    arr.append([a,[b,c,d,e]])

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

for num in range(n2):
    #입력 받은 순서대로 하나씩 체크
    #가장 먼저 첫번째 거 테스트
    candidate = []

    r = arr[num][1] #여기에 좋아하는 친구들 담겨있음
    for i in range(n):
        for j in range(n):
            if board[i][j] == 0:
                like = 0
                empty = 0
                for k in range(4):
                    nx = i + dx[k]
                    ny = j + dy[k]
                    if nx>=n or ny>=n or nx<0 or ny<0:
                        continue
                    if board[nx][ny] == 0:
                        empty+=1
                    if board[nx][ny] in r:
                        like += 1
                candidate.append((like,empty,i,j))
    candidate = sorted(candidate, key=lambda x:(-x[0],-x[1],x[2],x[3]))
    board[candidate[0][2]][candidate[0][3]] = arr[num][0]
#만족도 계산
ans = 0
for i in range(n):
    for j in range(n):
        cnt =0
        for d in range(4):
            nx = i+dx[d]
            ny = j+dy[d]
            if nx<0 or ny<0 or nx>=n or ny>=n:
                continue
            for k in range(n2):
                if arr[k][0] == board[i][j]:
                    if board[nx][ny] in arr[k][1]:
                        cnt+=1
        if cnt!=0:
            ans += 10**(cnt-1)
print(ans)
반응형
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!