1 분 소요

문제링크 : https://www.acmicpc.net/problem/1780

matrix에 있는 종이의 갯수를 계산하는 문제로, 일련의 절차를 반복적으로 수행해야 한다

이에 따라 제귀로 풀었으며, 2차원 리스트를 슬라이싱 하는 방법으로

tmp = [matrix1[i][col:col + count // 3] for i in range(row, row+count // 3)]를 사용했다.

만약 종이의 원소가 하나로 통일되지 않을 경우에는, 제귀함수를 호출했으며 종료조건은 모든 반복이 끝났을 때이다.

필자는 처음부터 원소가 하나로 통일된 경우를 고려하지 않아서, 시간이 조금 걸렸다.


import sys
import math
sys.setrecursionlimit(10**8)


def checkCnt(matrix1, count):
    global cnt_0, cnt_1, cnt_2
    for row in range(0, count, count // 3):
        for col in range(0, count, count // 3):
            tmp = [matrix1[i][col:col + count // 3] for i in range(row, row+count // 3)]
            base = tmp[0][0]
            flag = 0
            for row1 in range(count // 3):
                flag = 0
                for col1 in range(count // 3):
                    if base != tmp[row1][col1]:
                        flag = 1
                        break
                    if row1 == count//3 - 1 and col1 == count//3 - 1:
                        if base == 0:
                            cnt_0 += 1
                        elif base == 1:
                            cnt_1 += 1
                        elif base == -1:
                            cnt_2 += 1

                if flag == 1:
                    break
            if flag == 1:
                checkCnt(tmp, count // 3)
    return


N = int(input())
matrix = []
for _ in range(N):
    tmp = list(map(int, sys.stdin.readline().split()))
    matrix.append(tmp)

cnt = N
cnt_0 = 0
cnt_1 = 0
cnt_2 = 0 # -1
base_N = matrix[0][0]
flag_N = 0
for i in range(N):
    for j in range(N):
        if matrix[i][j] != base_N:
            flag_N = 1
            break
        if i == N-1 and j == N-1:
            if base_N == 0:
                cnt_0 += 1
            elif base_N == 1:
                cnt_1 += 1
            elif base_N == -1:
                cnt_2 += 1
    if flag_N:
        break

if flag_N:
    checkCnt(matrix, cnt)

print(cnt_2)
print(cnt_0)
print(cnt_1)

카테고리:

업데이트:

댓글남기기