본문 바로가기

백준 파이썬 코딩

백준 1780 종이의 개수 파이썬

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

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수

www.acmicpc.net

종이를 9개의 부분으로 나눈뒤 탐색을 해주면 되는 간단한 문제였다.

*한가지 주의할 점은 pypy로 제출해야 했고, 나누기전 초기 종이에서도 한번 탐색을 해줘야 하는 것이다. (처음부터 성분이 1개일때.)

def ch(s,a,b,c,d):#9개의 부분중 한 부분을 탐색하는 함수이다.
    global re
    ch = set()
    t = 0
    e=[]
    for i in range(a,b):
        e.append([])
        for j in range(c,d):
            e[t].append(s[i][j])
            ch.add(s[i][j])
        t+=1
    if len(ch)!= 1:
        sp(e)#한개의 성분만 있는 것이 아닐 경우 다시 나눠준다.
    else:#한개의 성분으로 이루어져 있으므로 결과를 더해준다.
        if ch=={1}:
            re[2]+=1
        elif ch=={-1}:
            re[0]+=1
        elif ch=={0}:
            re[1]+=1
            
def sp(s):
    a3 = len(s)
    a2 = len(s)//3*2
    a1 = len(s)//3
    ch(s,a1,a2,0,a1)#종이를 9개의 부분으로 나눈 것이다.
    ch(s,a1,a2,a1,a2)
    ch(s,a1,a2,a2,a3)
    ch(s,0,a1,0,a1)
    ch(s,0,a1,a1,a2)
    ch(s,0,a1,a2,a3)
    ch(s,a2,a3,0,a1)
    ch(s,a2,a3,a1,a2)
    ch(s,a2,a3,a2,a3)
    
n = int(input())
stand = [list(map(int,input().split())) for _ in range(n)]
e =set()
re =[0,0,0]
for i in range(n):#처음 나누기 전에 탐색해줘야한다. 안 그러면 20%를 못 넘김. (하나의 숫자로 가득 찬 경우)
    for j in range(n):
        e.add(stand[i][j])
if len(e)==1:
    if e=={1}:
            re[2]+=1
    elif e=={-1}:
            re[0]+=1
    elif e=={0}:
            re[1]+=1
else:#2개 이상의 성분으로 이루어져 있으므로 분할을 해준다.
    sp(stand)
for i in re:#결과를 출력해준다.
    print(i)