백준 21608번 파이썬
https://www.acmicpc.net/problem/21608
묵묵히 구현하면 되는 문제이다. 각 좌표의 4방향마다 likecnt와 emptycnt를 구한 후 갱신해 줘서 최댓값일 때의 좌표에 학생을 배치한다.
포인트가 될 부분은 우선순위를 정하는 방식인데, 처음부터 행과 열을 순서대로 훑으면 행과 열에 대한 우선순위는 자동으로 3순위 4순위가 된다 -> 기억할 것!
import sys
from collections import defaultdict
input = sys.stdin.readline
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
N = int(input())
arr = [[0]*N for _ in range(N)]
likedict = defaultdict(list)
result = 0
for _ in range(N*N):
_input = list(map(int, input().split()))
likedict[_input[0]] = _input[1:]
max_x = 0
max_y = 0
max_like = -1
max_empty = -1
for i in range(N):
for j in range(N):
if arr[i][j] == 0:
likecnt = 0
emptycnt = 0
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < N and 0 <= ny < N:
if arr[nx][ny] in _input:
likecnt += 1
if arr[nx][ny] == 0:
emptycnt += 1
if max_like < likecnt or (max_like == likecnt and max_empty < emptycnt):
max_x = i
max_y = j
max_like = likecnt
max_empty = emptycnt
arr[max_x][max_y] = _input[0]
for i in range(N):
for j in range(N):
cnt = 0
like = likedict[arr[i][j]]
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < N and 0 <= ny < N:
if arr[nx][ny] in like:
cnt += 1
if cnt != 0:
result += 10 ** (cnt-1)
print(result)
깊이 생각해볼 것. 처음부터 문제에 달려들지 않을 것. 오히려 함수를 쓰지 않을 때에 더 쉽게 로직을 짤 수 있는 문제도 많다는 것을 명심할 것 -> 함수가 필요하다면 왜 함수를 써야 하는지 생각해볼 것.