요구사항
- 데이터의 개수 3**7 대략 2000개
- 시간 제한 2초 대략 N**2 까지 가능
- 메모리제한 : 256 * 10^6 바이트
- 종이가 모두 같은 수로 되어 있다면 그대로 사용
- 그렇지 않을 경우 종이를 계속 잘라 같은 숫자만 남게 한다.
- 위와 같이 종이를 잘랐을 때, 각 숫자별 종이의 개수를 구해라.
설계
- 종이의 크기를 결정할 K 를 입력 받는다.
- K x K 크기의 종이를(2차원 배열) 받는다.
- 종이에 적힌 숫자의 개수를 저장할 리스트를 초기화한다.
- 사용자 정의 함수를 만든다.
- 초기값은 number = paper[x][y] = paper[0][0]
- for i in range(x, x+N), for j in range(y, y+N)
- 만약 number != paper[i][j]
사사분면에 대해 사용자 정의 함수를 실행한다.
- 총 9등분을 해야 한다. 따라서
- 아래와 같이 짜준다.
for dx in range(3):
for dy in range(3):
div(x + dx * K // 3, y + dy * K // 3, K // 3)
- 9등분의 좌표 이동:
- (x, y) -> 좌상단
- (x, y + K//3) -> 중상단
- (x, y + 2*K//3) -> 우상단
- (x + K//3, y) -> 좌중단
- (x + K//3, y + K//3) -> 중앙
- (x + K//3, y + 2*K//3) -> 우중단
- (x + 2*K//3, y) -> 좌하단
- (x + 2*K//3, y + K//3) -> 중하단
- (x + 2*K//3, y + 2*K//3) -> 우하단
- return
- 함수를 실행한다. div(0,0,K)
- 각 숫자를 카운트해서 출력한다.
구현
import sys
input = lambda: sys.stdin.readline().rstrip()
K = int(input())
paper = [list(map(int, input().split())) for _ in range(K)]
result = []
def div(x, y, K):
number = paper[x][y]
for i in range(x, x + K):
for j in range(y, y + K):
if number != paper[i][j]: # 종이 값이 다르면 9등분
for dx in range(3):
for dy in range(3):
div(x + dx * K // 3, y + dy * K // 3, K // 3)
return
if number == 0:
result.append(-1)
elif number == 1:
result.append(0)
else:
result.append(1)
div(0, 0, K)
print(result.count(1))
print(result.count(0))
print(result.count(-1))