Computer Science/알고리즘

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

바보1 2023. 10. 20. 21:46

0.  문제 링크

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1.  풀이 방법

 

 

  1. Divide and Conquer 방식을 사용했고, 트리 내에서는 반복문을 사용하여 문제를 해결하였다.
  2. 첫 번째 숫자인 bef와 반복문에서 나오는 숫자가 다를 경우 압축이 불가능하므로, 해당 트리를 사등분하여 재귀를 호출했다.
  3. 사등분 한 쿼드 트리를 모두 호출한 이후에는 return을 함으로써, 반복문을 바로 종료했다. -> 트리를 사등분하면 더 이상 볼 필요가 없음.

2.  코드

 

 

def solution(arr):
    def encode(y, x, l):
        # l == 1이면 어차피 아래 반복문에서 처리됨
        bef = arr[y][x]     # 최초 번호, 다른 수는 최초 번호와 무조건 같아야함.
        for i in range(y, y + l):
            for j in range(x, x + l):
                if arr[i][j] != bef:        # 다르면 쿼드트리
                    encode(y, x, l // 2)
                    encode(y, x + l // 2, l // 2)
                    encode(y + l // 2, x, l // 2)
                    encode(y + l // 2, x + l // 2, l // 2)
                    return
        else:
            answer[bef] += 1
        
        
    answer = [0, 0]
    encode(0, 0, len(arr))
    
    return answer

3.  마무리