반응형
문제
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)
반응형
'알고리즘' 카테고리의 다른 글
[백준/9694][C++] 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 (0) | 2023.10.20 |
---|---|
[백준/17835][C++] 면접보는 승범이네 (2) | 2023.09.28 |
[백준/16236][Python] 아기상어 (0) | 2023.09.20 |
[백준/1753][Python] 최단경로 (0) | 2023.09.19 |
[백준/17129][C++] 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유 (0) | 2023.09.14 |