[프로그래머스] 쿼드압축 후 개수 세기

박형진·2021년 11월 16일
0

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


1. 전체 코드

def solution(arr):
    #n=압축크기, x,y=시작좌표
    def recur(n, x, y):
        if n==1:
            return
        
        compression = True
        target = arr[x][y]
        
        for i in range(x, x+n):
            for j in range(y, y+n):
                if arr[i][j] != target:
                    compression = False
                    
        if compression:
            if arr[x][y] == 0:
                answer[0] += 1
            else:
                answer[1] += 1
            
            for i in range(x, x+n):
                for j in range(y, y+n):
                    arr[i][j] = 9
                    
        else:
            n = int(n // 2)
            recur(n, x, y)
            recur(n, x, y+n)
            recur(n, x+n, y)
            recur(n, x+n, y+n)
            
    
    answer = [0, 0]
    S = len(arr)
    
    recur(S, 0, 0)
    
    for i in range(len(arr)):
        for j in range(len(arr)):
            if arr[i][j] == 0:
                answer[0] += 1
            elif arr[i][j] == 1:
                answer[1] += 1
    
    return answer

2. 풀이

재귀함수를 사용하여 m칸이 모두 동일한 값(1 또는 0)인지 확인했다. m이 1이 될 때, 조건문을 통해 재귀함수에서 탈출한다. m칸의 값이 모두 동일하여 한 칸으로 치환되는 원소들은 이미 쿼드압축이 끝났다는 의미로 사용할 값인 9로 바꿔준다.

  1. 압축을 시도한다.

  2. 압축에 실패할 경우, 4개의 영역을 재귀함수로 나누어 같은 작업을 반복해준다.

  3. 재귀함수가 종료되면 남아있는 0과 1의 갯수를 2중 for문을 통해 더해준다. 이미 쿼드압축 처리된 원소들은 9의 값을 가지므로 무시한다.

profile
안녕하세요!

0개의 댓글