0과 1로 이루어진 2n x 2n 크기의 2차원 정수 배열 arr이 있습니다. 당신은 이 arr을 쿼드 트리와 같은 방식으로 압축하고자 합니다. 구체적인 방식은 다음과 같습니다.
def compress(arr):
n = len(arr[0])
mid = n // 2
if mid == 0: return [arr[0][0]]
cnt = 0
for a in arr: cnt += sum(a)
if cnt == 0: return [0]
elif cnt == n*n: return [1]
s1, s2, s3, s4 = (
[a[:mid] for a in arr[:mid]],
[a[mid:] for a in arr[:mid]],
[a[:mid] for a in arr[mid:]],
[a[mid:] for a in arr[mid:]]
)
return compress(s1) + compress(s2) + compress(s3) + compress(s4)
def solution(arr):
result = compress(arr)
return [result.count(0), result.count(1)]
2차원 배열 다루기는 numpy
가 간편하다.
아래는 numpy
를 이용한 풀이다.
import numpy as np
def compress(arr):
if np.all(arr == 0): return np.array([1,0])
if np.all(arr == 1): return np.array([0,1])
mid = arr.shape[0] // 2
return compress(arr[:mid,:mid]) + compress(arr[:mid, mid:]) + compress(arr[mid:, :mid]) + compress(arr[mid:, mid:])
def solution(arr):
return compress(np.array(arr)).tolist()
- set 사용이 너무 버릇처럼 된것 같다..
- 간단한 중복 점검은 set을 지양해보자. (list -> set convert가 꽤 골치다)