Skip to content

Commit 216d093

Browse files
committed
[level 2] Title: 쿼드압축 후 개수 세기, Time: 356.01 ms, Memory: 11.5 MB -BaekjoonHub
1 parent 32d012f commit 216d093

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# [level 2] 쿼드압축 후 개수 세기 - 68936
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/68936#)
4+
5+
### 성능 요약
6+
7+
메모리: 11.5 MB, 시간: 356.01 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 월간 코드 챌린지 시즌1
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 05월 11일 06:24:31
20+
21+
### 문제 설명
22+
23+
<p>0과 1로 이루어진 2<sup>n</sup> x 2<sup>n</sup> 크기의 2차원 정수 배열 arr이 있습니다. 당신은 이 arr을 <a href="https://en.wikipedia.org/wiki/Quadtree" target="_blank" rel="noopener">쿼드 트리</a>와 같은 방식으로 압축하고자 합니다. 구체적인 방식은 다음과 같습니다.</p>
24+
25+
<ol>
26+
<li>당신이 압축하고자 하는 특정 영역을 S라고 정의합니다.</li>
27+
<li>만약 S 내부에 있는 모든 수가 같은 값이라면, S를 해당 수 하나로 압축시킵니다.</li>
28+
<li>그렇지 않다면, S를 정확히 4개의 균일한 정사각형 영역(입출력 예를 참고해주시기 바랍니다.)으로 쪼갠 뒤, 각 정사각형 영역에 대해 같은 방식의 압축을 시도합니다.</li>
29+
</ol>
30+
31+
<p>arr이 매개변수로 주어집니다. 위와 같은 방식으로 arr을 압축했을 때, 배열에 최종적으로 남는 0의 개수와 1의 개수를 배열에 담아서 return 하도록 solution 함수를 완성해주세요.</p>
32+
33+
<hr>
34+
35+
<h5>제한사항</h5>
36+
37+
<ul>
38+
<li>arr의 행의 개수는 1 이상 1024 이하이며, 2의 거듭 제곱수 형태를 하고 있습니다. 즉, arr의 행의 개수는 1, 2, 4, 8, ..., 1024 중 하나입니다.
39+
40+
<ul>
41+
<li>arr의 각 행의 길이는 arr의 행의 개수와 같습니다. 즉, arr은 정사각형 배열입니다.</li>
42+
<li>arr의 각 행에 있는 모든 값은 0 또는 1 입니다.</li>
43+
</ul></li>
44+
</ul>
45+
46+
<hr>
47+
48+
<h5>입출력 예</h5>
49+
<table class="table">
50+
<thead><tr>
51+
<th>arr</th>
52+
<th>result</th>
53+
</tr>
54+
</thead>
55+
<tbody><tr>
56+
<td><code>[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]]</code></td>
57+
<td><code>[4,9]</code></td>
58+
</tr>
59+
<tr>
60+
<td><code>[[1,1,1,1,1,1,1,1],[0,1,1,1,1,1,1,1],[0,0,0,0,1,1,1,1],[0,1,0,0,1,1,1,1],[0,0,0,0,0,0,1,1],[0,0,0,0,0,0,0,1],[0,0,0,0,1,0,0,1],[0,0,0,0,1,1,1,1]]</code></td>
61+
<td><code>[10,15]</code></td>
62+
</tr>
63+
</tbody>
64+
</table>
65+
<hr>
66+
67+
<h5>입출력 예 설명</h5>
68+
69+
<p>입출력 예 #1</p>
70+
71+
<ul>
72+
<li>다음 그림은 주어진 arr을 압축하는 과정을 나타낸 것입니다.</li>
73+
<li><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/d6900862-8be4-4610-aaef-bc8efd5650cf/ex1.png" title="" alt="ex1.png"></li>
74+
<li>최종 압축 결과에 0이 4개, 1이 9개 있으므로, <code>[4,9]</code>를 return 해야 합니다.</li>
75+
</ul>
76+
77+
<p>입출력 예 #2</p>
78+
79+
<ul>
80+
<li>다음 그림은 주어진 arr을 압축하는 과정을 나타낸 것입니다.</li>
81+
<li><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/952a05b7-5157-4211-82d9-02845c187e13/ex2.png" title="" alt="ex2.png"></li>
82+
<li>최종 압축 결과에 0이 10개, 1이 15개 있으므로, <code>[10,15]</code>를 return 해야 합니다.</li>
83+
</ul>
84+
85+
86+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import sys
2+
sys.setrecursionlimit(10**6)
3+
4+
def solution(arr):
5+
ans = [0, 0]
6+
7+
def _divid(x, y, size):
8+
num = arr[x][y]
9+
if all(arr[i][j]==num for i in range(x, x+size) for j in range(y, y+size)):
10+
ans[num] += 1
11+
return
12+
13+
mid = size//2
14+
for dx, dy in ((0,0), (0,mid), (mid,0), (mid,mid)):
15+
_divid(x+dx, y+dy, mid)
16+
17+
_divid(0, 0, len(arr))
18+
return ans

0 commit comments

Comments
 (0)