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

yylog·2022년 10월 20일
0
post-custom-banner

문제

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

소스

if __name__ == "__main__":
    n = int(input())
    students = [list(map(int,input().split())) for _ in range(n*n)]
    res = [[0] * n for _ in range(n)]
    
    dx = [1,-1,0,0]
    dy =[0,0,1,-1]
    for idx in range(n*n):
        student = students[idx]
        tmp = []
        for i in range(n):
            for j in range(n):
                if res[i][j] == 0:                   
                    friend = 0
                    empty = 0
                    for k in range(4):
                        x = i + dx[k]
                        y = j + dy[k]
                        if 0<=x<n and 0<=y<n:
                            if res[x][y] in student[1:]:
                                friend +=1
                            if res[x][y] == 0:
                                empty +=1
                    tmp.append([friend,empty,i,j])
        tmp.sort(key = lambda x: (-x[0],-x[1],x[2],x[3]))
        res[tmp[0][2]][tmp[0][3]] = student[0]
    
    total = 0
    students.sort(key = lambda x: x[0])
    for i in range(n):
        for j in range(n):
            cnt = 0
            for k in range(4):
                x = i + dx[k]
                y = j + dy[k]
                if 0<=x<n and 0<=y<n:
                    if res[x][y] in students[res[i][j]-1][1:]:
                        cnt +=1

            if cnt != 0:
                total += 10 ** (cnt -1)
    print(total)

설명

구현 문제이다. 문제를 잘 읽고 하라는 대로 하면 된다.
조건은 다음과 같다.
1. 인접한 곳에 좋아하는 친구가 많은지 체크한다.
2. 1의 조건이 같다면 인접한 곳이 빈곳이 많은지 체크한다.
3. 2,1의 조건이 같다면 행이 작은 것, 열이 작은 것 순으로 선택한다.

1,2를 한번에 체크한 후 (친구수,빈칸,행,열) 순으로 정렬을 통해서 0 번째를 출력하면 된다.

후기

어렵게 생각하지말기 꼬아서 생각하지 않기

profile
경험하고 공부한 모든 것을 기록하는 공간
post-custom-banner

0개의 댓글