[백준/Python] 21608 상어 초등학교

2.so_j·2023년 9월 11일
post-thumbnail

문제는 여기

코드

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

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

for student in students:
    available = []

    for x in range(n):
        for y in range(n):
            if sit[x][y] == 0:
                # 아직 아무도 앉지 않았다면
                around, friend = 0, 0

                for i in range(4):
                    nx = dx[i] + x
                    ny = dy[i] + y

                    if 0 <= nx < n and 0 <= ny < n:
                        if sit[nx][ny] in student[1:]:
                            friend += 1

                        if sit[nx][ny] == 0:
                            around += 1
                available.append((friend, around, x, y))
    available.sort(key= lambda x : (-x[0], -x[1], x[2], x[3]))
    sit[available[0][2]][available[0][3]] = student[0]

students.sort()
result = 0
score = [0,1,10,100,1000]
for x in range(n):
    for y in range(n):
        around = 0

        for i in range(4):
            nx = dx[i] + x
            ny = dy[i] + y

            if 0 <= nx < n and 0 <= ny < n:
                if sit[nx][ny] in students[sit[x][y]-1]:
                    around += 1

        result += score[around]

print(result)

기록할 점

  • 문제가 길어도 겁먹지 않는게 중요해보인다 (제발제발)

해석: 자리를 정할거임 근데 조건이 있음

  1. 좋아하는 학생이 인접한 칸에 가장 많은 칸으로 자리를 정한다
    : 인접한 칸을 다 봐야함 + 좋아하는 학생을 체크해야함 + 자리를 정하는 배열이 있어야함
  2. 인접한 칸 중에서 빈 칸이 가장 많은 칸으로 자리 정하기
    : 인접한 칸을 보는 코드 안에 빈 칸의 개수를 세야함
  3. 행 번호가 가장 적은, 여러 개면 열 번호가 가장 적은
    : x, y 좌표를 넣어야겠다

이런식으로 문제를 해석하는게 중요해보인다

profile
싱글코어 두뇌의 개발자 도전기

0개의 댓글