본문 바로가기
알고리즘

[백준/파이썬] #21608

by 룰루루 2025. 5. 15.

30분이 초과했다.... 함수 단위로 분해하려고 했는데 생각보다 복잡해져서 꼬여버린 것 같다. 

import heapq
from collections import defaultdict

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


def best_seat(liked_students):
    global adjacent_vacant_seat
    adjacent_seats = defaultdict(lambda: 0)
    for liked_student in liked_students:

        # 좋아하는 학생이 아직 자리를 배정받지 않았을 경우
        if not student_to_seat[liked_student]:
            continue

        current_row, current_col = student_to_seat[liked_student]
        for k in range(4):
            nrow, ncol = current_row + dx[k], current_col + dy[k]
            if nrow < 0 or nrow >= N or ncol < 0 or ncol >= N:
                continue

            # 인접한 좋아하는 학생 수 구하기
            adjacent_seats[(nrow, ncol)] += 1

    if len(adjacent_seats) == 0:
        adjacent_count, row, col = heapq.heappop(adjacent_vacant_seat)
        if adjacent_count > 0:
            heapq.heappush(adjacent_vacant_seat, (adjacent_count-1, row, col))


def sit():
    global seat, student_to_seat
    for s in students:
        student, liked_students = s[0], s[1:]
        row, col = best_seat(liked_students)
        seat[row][col] = student
        student_to_seat[student] = (row, col)


def calculate_satisfaction():
    global answer
    pass


if __name__ == "__main__":
    N = int()
    answer = 0
    students = []
    student_to_seat = defaultdict(list)
    seat = [[0] * N for _ in range(N)]
    adjacent_vacant_seat = []

    for i in range(N*N):
        s = list(map(int, input().split()))
        students.append(s)
        student_to_seat[s[0]] = False

    for i in range(N):
        for j in range(N):
            seat[i][j] = 0
            if (i == 0 or i == N-1) and (j == 0 or j == N-1):
                heapq.heappush(adjacent_vacant_seat, (2, i, j))
            elif (i == 0 or i == N-1) or (j == 0 or j == N-1):
                heapq.heappush(adjacent_vacant_seat, (3, i, j))
            else:
                heapq.heappush(adjacent_vacant_seat, (4, i, j))

    sit(students)
    calculate_satisfaction()
    print(answer)

 

다른 풀이를 참고해서 풀었다. 

N = int(input())
students = [list(map(int, input().split())) for _ in range(N * N)]
data = [[0] * N for _ in range(N)]

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

for student in students:
    available = []

    for i in range(N):
        for j in range(N):
            if data[i][j] != 0:
                continue
            
            prefer, empty = 0, 0
            for k in range(4):
                nx, ny = i + dx[k], j + dy[k]
                if nx < 0 or nx >= N or ny < 0 or ny >= N:
                    continue

                if data[nx][ny] in student[1:]:
                    prefer += 1

                if data[nx][ny] == 0:
                    empty += 1
            
            available.append((i, j, prefer, empty))
    
    available.sort(key=lambda x: (-x[2], -x[3], x[0], x[1]))
    data[available[0][0]][available[0][1]] = student[0]


answer = 0
score = [0, 1, 10, 100, 1000]
students.sort()

for i in range(N):
    for j in range(N):
        count = 0

        for k in range(4):
            nx, ny = i + dx[k], j + dy[k]
            if 0 <= nx < N and 0 <= ny < N:
                if data[nx][ny] in students[data[i][j] - 1]:
                    count += 1

        answer += score[count]

print(answer)

 

'알고리즘' 카테고리의 다른 글

[백준/파이썬] #17836  (0) 2025.05.20
[백준/파이썬] #2469  (0) 2025.05.18
[백준/파이썬] #16927  (0) 2025.05.11
[백준/파이썬] #2011  (0) 2025.05.08
[백준/파이썬] #1062  (0) 2025.05.05