code review/implementation
[python] 백준 19237번: 어른 상어
jmHan
2022. 1. 25. 11:26
반응형
https://www.acmicpc.net/problem/19237
19237번: 어른 상어
첫 줄에는 N, M, k가 주어진다. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000) 그 다음 줄부터 N개의 줄에 걸쳐 격자의 모습이 주어진다. 0은 빈칸이고, 0이 아닌 수 x는 x번 상어가 들어있는 칸을 의미
www.acmicpc.net
1. 코드 구현
students = {}
d = [(-1,0),(0,1),(0,-1),(1,0)]
n = int(input())
maze = [[0]*(n+1) for _ in range(n+1)]
for _ in range(n**2):
a = list(map(int, input().split()))
students[a[0]] = a[1:]
tmp = []
for i in range(1, n+1):
for j in range(1, n+1):
blank = 0
favorite = 0
# 비어있는 칸이라면
if maze[i][j] == 0:
for dx, dy in d:
if 0<dx+i<n+1 and 0<dy+j<n+1:
# 인접한 칸이 비어있는 경우
if maze[dx+i][dy+j] == 0:
blank += 1
# 인접한 칸에 좋아하는 학생이 있는 경우
if maze[dx+i][dy+j] in students[a[0]]:
favorite += 1
tmp.append([favorite, blank, i, j])
# 좋아하는 학생과 가장 많이 인접한 칸, 비어있는 칸, 행, 열 기준으로 정렬
tmp.sort(key=lambda x:(-x[0], -x[1], x[2],x[3]))
maze[tmp[0][2]][tmp[0][3]] = a[0]
satisfied = [0, 1, 10, 100, 1000]
res = 0
for i in range(1,n+1):
for j in range(1, n+1):
# 인접한 칸에 앉아있는 좋아하는 학생 수
cnt = 0
for dx, dy in d:
if 0<dx+i<n+1 and 0<dy+j<n+1:
# 인접한 칸에 좋아하는 학생이 있다면
if maze[i+dx][j+dy] in students[maze[i][j]]:
cnt += 1
res += satisfied[cnt]
print(res)
반응형