○ (Python) (구현) 백준 21608 하이초등학교

문제

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

제21608호: 하이초등학교

Shark Elementary School에는 하나의 교실이 있으며 교실은 N×N 그리드로 나타낼 수 있습니다. 학교에 다니는 학생의 수는 N2입니다. 오늘은 모든 학생들을 위해 자리가 마련되는 날입니다. 학생들은 1부터 N2까지 번호가 매겨져 있습니다.

www.acmicpc.net

암호

import sys
input=sys.stdin.readline

dx=(-1,1,0,0)
dy=(0,0,-1,1)

n=int(input())
array=((0)*n for _ in range(n))

sati=(() for _ in range((n**2)+1))
for i in range(n**2):
    temp=list(map(int, input().split()))
    sati(temp(0)).append(temp(1))
    sati(temp(0)).append(temp(2))
    sati(temp(0)).append(temp(3))
    sati(temp(0)).append(temp(4))

    # 가능한 자리를 담는 임시 배열
    arrayT=()
    for j in range(n):
        for k in range(n):
            if array(j)(k)==0:
                # 좋아하는 친구
                countA=0
                # 빈칸
                countB=0
                for l in range(4):
                    nx=j+dx(l)
                    ny=k+dy(l)
                    if 0<=nx<n and 0<=ny<n:
                       if array(nx)(ny) in temp(1:): countA+=1
                       elif array(nx)(ny)==0: countB+=1
                arrayT.append((countA,countB,j,k))
    # 1번째, 2번째 인자는 내림차순으로, 3번째, 4번째 인자는 오름차순으로 정렬해줘!
    arrayT.sort(key = lambda x: (-x(0),-x(1),x(2),x(3)))
    array(arrayT(0)(2))(arrayT(0)(3))=temp(0)

result=0
for i in range(n):
    for j in range(n):
        count=0
        for k in range(4):
            nx=i+dx(k)
            ny=j+dy(k)
            if 0<=nx<n and 0<=ny<n:
                if array(nx)(ny) in sati(array(i)(j)):
                    count+=1
        result += (10**(count-1)) if count>=1 else 0

print(result)

시간적 복잡성

(n**4)

어려운 부분

처음 센터에 들어오는 학생이 센터에 들어와야 한다고 생각했는데 나중에 알고 보니 세 번째 조건을 위반한 것이었다.