티스토리 뷰

문제

 

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

 

21608번: 상어 초등학교

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

www.acmicpc.net

 

 

풀이

 

구현만 하면 되는 문제였다. 

 

학생별로 모든 칸을 탐색하며 빈 칸인 경우엔 상하좌우 칸을 확인해서 좋아하는 친구의 수, 비어있는 칸 수를 기록하여 (x,y,좋아하는 수, 빈 칸 수)의 형태로 리스트에 담아주었다.

 

이후에 정렬을 통해 문제의 조건대로 정렬해주었고, 맨 앞의 자리에 학생을 앉게 하였다.

정렬할 때, filter의 형식이 스위프트와 좀 달라서 헷갈렸다. lambda를 이용해보니 신세계..

 

import sys
input = sys.stdin.readline
d = [(1,0),(-1,0),(0,1),(0,-1)]
n = int(input())
seats = [[0 for _ in range(n)] for _ in range(n)]
students = {}
for _ in range(n * n):
    temp = list(map(int,input().split()))
    student = temp[0]; likeList = temp[1:]
    students[student] = likeList
    available = [] # (x,y,좋아하는수,빈칸수)
    for i in range(n):
        for j in range(n):
            if seats[i][j] == 0:
                #비어있는 칸이므로 주변에 비어있는칸과 좋아하는 수 확인후에 available에 넣기
                emptyCount = 0; likeCount = 0
                for k in range(4):
                    newX = i + d[k][0]; newY = j + d[k][1]
                    if newX < 0 or newY < 0 or newX >= n or newY >= n:
                        continue
                    if seats[newX][newY] == 0:
                        emptyCount += 1
                    elif seats[newX][newY] in likeList:
                        likeCount += 1
                available.append((i,j,likeCount,emptyCount))
    available.sort(key=lambda n: (n[2],n[3],-n[0],-n[1]),reverse=True)
    seats[available[0][0]][available[0][1]] = student
sum = 0
for i in range(n):
    for j in range(n):
        count = 0
        for k in range(4):
            newX = i + d[k][0]; newY = j + d[k][1]
            if newX < 0 or newY < 0 or newX >= n or newY >= n:
                continue
            if seats[newX][newY] in students[seats[i][j]]:
                count += 1
        if count == 1:
            sum += 1
        elif count == 2:
            sum += 10
        elif count == 3:
            sum += 100
        elif count == 4:
            sum += 1000
print(sum)

 

 

_____________________________________________________________________________________________________

 

파이썬 문법에 조금씩 적응된다고 생각했는데 아직 한참남은듯.. filter가 엄청 간편한데 헷갈림.

댓글
최근에 올라온 글
Total
Today
Yesterday