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)
'백준 파이썬 코딩' 카테고리의 다른 글
백준 16235 나무 재테크 파이썬 (1) | 2022.09.24 |
---|---|
백준 1010 다리놓기 파이썬 (0) | 2022.09.24 |
백준 17822 원판 돌리기 파이썬 (0) | 2022.09.17 |
백준 14246 K보다 큰 구간 파이썬 반례 1개 O (2) | 2022.09.11 |
백준 16236 아기상어 파이썬 (0) | 2022.09.10 |