[백준] #21608 Python

Jiyoon·2021년 10월 2일
0

Algorithm

목록 보기
15/24

백준 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)

느낀점

깊이 생각해볼 것. 처음부터 문제에 달려들지 않을 것. 오히려 함수를 쓰지 않을 때에 더 쉽게 로직을 짤 수 있는 문제도 많다는 것을 명심할 것 -> 함수가 필요하다면 왜 함수를 써야 하는지 생각해볼 것.

0개의 댓글