본문 바로가기

파이썬

[백준] 21608번 상어 초등학교

21608번: 상어 초등학교 (acmicpc.net)

 

21608번: 상어 초등학교

상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호

www.acmicpc.net

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

dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]

seat[1][1] = students[0][0] # 첫번째는 항상 1,1에 앉는다.

for i in range(1, N**2):
    student = students[i]
    tmp = []
    for r in range(N):
        for c in range(N):
            empty = 0
            like = 0
            if seat[r][c] == 0:
                for d in range(4):
                    nr = r + dr[d]
                    nc = c + dc[d]
                    if 0 <= nr < N and 0 <= nc < N:
                        if seat[nr][nc] == 0:
                            empty += 1
                        if seat[nr][nc] in student:
                            like += 1
                        tmp.append([like, empty, r, c])

    tmp.sort(key= lambda x:(-x[0], -x[1], x[2], x[3]))
    seat[tmp[0][2]][tmp[0][3]] = student[0]

result = 0
students.sort()
for r in range(N):
    for c in range(N):
        like = 0
        for d in range(4):
            nr = r + dr[d]
            nc = c + dc[d]
            if 0 <= nr < N and 0 <= nc < N:
                if seat[nr][nc] in students[seat[r][c]-1]:
                    like += 1
        if like <= 1:
            result += like
        elif like == 2:
            result += 10
        elif like == 3:
            result += 100
        elif like == 4:
            result += 1000

print(result)

 

BFS문제

들어갈 수 있는 모든 자리에서 조건 순서대로 계산하여 리스트에 추가하여 lambda로 정렬해주고 자리를 배치해준다.

 

'파이썬' 카테고리의 다른 글

[백준] 2841 외계인의 기타연주  (0) 2022.06.01
[백준] 2644번 촌수계산  (0) 2022.06.01
[백준] 2178번 미로탐색  (0) 2022.05.31
[프로그래머스 level 1] 실패율 (python)  (0) 2022.05.21
백준 10951번 A+B-4 (파이썬)  (0) 2022.02.09