[プログラマ]四圧縮後のカウント
13572 ワード
使用するアルゴリズム/データ構造
これは問題の中で提出された条件を体現しなければならない問題である.
1回目の質問には次のような方法が使われました.
前述したように、すべてのデータを巡回してデータをチェックし、圧縮したデータを圧縮に保存し、圧縮していない場合は2 x 2格子を返して0/1をカウントする必要がある.
これにより、コードが複雑になり、管理する必要があるデータが多くなります.
これとは異なり、再帰文を使用して大きな面積を先に表示すると、アルゴリズムコードの変更が簡単になります.
これは問題の中で提出された条件を体現しなければならない問題である.
1回目の質問には次のような方法が使われました.
배열의 각 데이터를 2칸씩 for 문으로 돌면서
2x2크기 확인 -> 맞을 경우 4x4크기 확인 -> ...
コード#コード#def solution(arr):
n = len(arr)
compressed = [[False]*n for _ in range(n)]
cnt = [0, 0]
for i in range(0, n, 2):
for j in range(0, n, 2):
if compressed[i][j]:
continue
size = 2
while check(i, j, n, size, arr):
size *= 2
if size > 2:
compress(i, j, size//2, compressed)
cnt[arr[i][j]] += 1
else:
for x in range(i, i + 2):
for y in range(j, j + 2):
cnt[arr[x][y]] += 1
return cnt
def check(x, y, n, size, arr):
if x%size != 0 or y%size != 0 or x+size > n or y+size > n:
return False
for i in range(x, x + size):
for j in range(y, y + size):
if arr[i][j] != arr[x][y]:
return False
return True
def compress(x, y, size, compressed):
for i in range(x, x + size, 2):
for j in range(y, y + size, 2):
compressed[i][j] = True
コード改善方向前述したように、すべてのデータを巡回してデータをチェックし、圧縮したデータを圧縮に保存し、圧縮していない場合は2 x 2格子を返して0/1をカウントする必要がある.
これにより、コードが複雑になり、管理する必要があるデータが多くなります.
これとは異なり、再帰文を使用して大きな面積を先に表示すると、アルゴリズムコードの変更が簡単になります.
(0, 0)에서 시작
nxn 확인 -> 실패 시 (n/2)x(n/2) 4개의 칸을 각각 확인 -> ...
改良されたコードdef solution(arr):
cnt = [0, 0]
def check(size, x, y):
if size > 1:
for dx in range(size):
for dy in range(size):
if arr[x+dx][y+dy] != arr[x][y]:
check(size//2, x, y)
check(size//2, x + size//2, y)
check(size//2, x, y + size//2)
check(size//2, x + size//2, y + size//2)
return
cnt[arr[x][y]] += 1
check(len(arr), 0, 0)
return cnt
Reference
この問題について([プログラマ]四圧縮後のカウント), 我々は、より多くの情報をここで見つけました https://velog.io/@jadenkim5179/프로그래머스-쿼드압축-후-개수-세기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol