DevKim

[Python] 프로그래머스 Lv.02 - 쿼드압축 후 개수 세기 본문

알고리즘 PS

[Python] 프로그래머스 Lv.02 - 쿼드압축 후 개수 세기

on_doing 2021. 3. 8. 18:35
728x90

programmers.co.kr/learn/courses/30/lessons/68936

 

코딩테스트 연습 - 쿼드압축 후 개수 세기

[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]] [4,9] [[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]] [10,15]

programmers.co.kr

[ 알고리즘 ]

구현

 

[문제 접근]

아이디어가 필요한 문제이다. 2*2 형태로 [0의 개수,1의 개수를 구해준 후] 계속해서 반씩 더하며 줄여나가는 형태이다.

이때 [4,0] 과 같이 ( 0의 개수가 4개, 1의 개수가 0개) 같은 것은 0으로 압축할 수 있기 때문에 [1,0] 으로 바꿔주면된다

 

예를들어,

arr=[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]] 일때

[1,3],[4,0]... 이런식으로 압축

 

[코드]

import copy
def solution(arr):
    answer = []
    n=len(arr)
    List=[[] for _ in range(n//2)]
    
    # [0의 개수,1의 개수] 형태로 만들기
    for i in range(1,n,2):
        for j in range(1,n,2):
            cnt=[0,0]
            
            if arr[i][j]==0:cnt[0]+=1
            else:cnt[1]+=1
            
            if arr[i-1][j-1]==0:cnt[0]+=1
            else:cnt[1]+=1
            
            if arr[i-1][j]==0:cnt[0]+=1
            else:cnt[1]+=1
            
            if arr[i][j-1]==0:cnt[0]+=1
            else:cnt[1]+=1
                
            if cnt[0]==0:
                cnt[1]=1
            elif cnt[1]==0:
                cnt[0]=1
            
            List[i//2].append(cnt)

    while True:
        n=len(List)
        result=[[] for _ in range(n//2)]
        
        for i in range(1,n,2):
            for j in range(1,n,2):
                a=List[i][j][0]+List[i-1][j-1][0]+List[i-1][j][0]+List[i][j-1][0]
                b=List[i][j][1]+List[i-1][j-1][1]+List[i-1][j][1]+List[i][j-1][1]
                
                if a==0:
                    b=1
                if b==0:
                    a=1
                    
                result[i//2].append([a,b])

        List=copy.deepcopy(result)
        
        if len(result)==1:
            return result[0][0]
        
    return answer
728x90
Comments