Notice
Recent Posts
Recent Comments
05-10 16:01
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

-

[백준 21608] 상어 초등학교 - 파이썬 본문

Algorithm

[백준 21608] 상어 초등학교 - 파이썬

choiht 2024. 2. 18. 00:59
반응형

문제

https://www.acmicpc.net/problem/21608

 

21608번: 상어 초등학교

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

www.acmicpc.net

 

 

 

풀이 방법

n = 3 일 때, 전체 9칸을 차례대로 돌면서 주변에 있는 내가 원하는 번호의 개수와, 빈 자리를 체크하여 리스트에 저장한다.

문제에서 주어진 조건에 맞게 자리 배치를 하기 위해 lambda 함수를 사용해 리스트를 정렬하는데, 원하는 번호의 개수와 빈자리를 내림차순으로, 행과 열을 오름차순으로 정렬한다. 

이렇게 정렬을 마쳤으면 가장 첫 번째 오는 원소에 있는 행과 열에 해당하는 자리에 학생을 앉힌다. 

 

자리에 다 앉혔다면 이제 학생 번호 순서대로 각자가 원하는 번호와 몇개나 인접해있는지 개수를 센다. 

 

 

 

 

코드

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

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

for order in range(n**2):
    student = students[order]
    
    tmp = []
    for i in range(n):
        for j in range(n):
            if arr[i][j] == 0:
                like = 0
                blank = 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 student[1:]:
                            like += 1
                        if arr[nx][ny] == 0:
                            blank += 1
                            
                tmp.append([like, blank, i, j])
                
    tmp.sort(key = lambda x:(-x[0], -x[1], x[2], x[3]))
    arr[tmp[0][2]][tmp[0][3]] = student[0]
    
        

result = 0
students.sort()


for i in range(n):
    for j in range(n):
        ans = 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 students[arr[i][j]-1]:
                    ans += 1
                    
        if ans != 0:
            result += 10 ** (ans - 1)
            
            
print(result)
반응형
Comments