본문 바로가기

CodeGym/프로그래머스

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

728x90


문제설명

더보기

0과 1로 이루어진 2n x 2n 크기의 2차원 정수 배열 arr이 있습니다. 당신은 이 arr을 쿼드 트리와 같은 방식으로 압축하고자 합니다. 구체적인 방식은 다음과 같습니다.

당신이 압축하고자 하는 특정 영역을 S라고 정의합니다

만약 S 내부에 있는 모든 수가 같은 값이라면, S를 해당 수 하나로 압축시킵니다.

그렇지 않다면, S를 정확히 4개의 균일한 정사각형 영역(입출력 예를 참고해주시기 바랍니다.)으로 쪼갠 뒤, 각 정사각형 영역에 대해 같은 방식의 압축을 시도합니다.

arr이 매개변수로 주어집니다. 위와 같은 방식으로 arr을 압축했을 때, 배열에 최종적으로 남는 0의 개수와 1의 개수를 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

 

제한사항

더보기
  • arr의 행의 개수는 1 이상 1024 이하이며, 2의 거듭 제곱수 형태를 하고 있습니다. 즉, arr의 행의 개수는 1, 2, 4, 8, ..., 1024 중 하나입니다.
    • arr의 각 행의 길이는 arr의 행의 개수와 같습니다. 즉, arr은 정사각형 배열입니다.
    • arr의 각 행에 있는 모든 값은 0 또는 1 입니다.

 

입출력 예


문제풀이

  • 정사각형의 이차원 배열을 기준으로 정확하게 4등분을 한 후 각각의 사분면이 모든 같은 숫자라면 압축하여 하나의 판으로 만들어주고 그렇지 않다면 각각의 사분면에서 4등분을 하여 압축이 가능한지를 반복하는 작업을 구현하는 것이다. 그리고 마지막으로 배열의 단위 원소 까지 등분이 되어지면 압축된 전체 면적에서 0과 1의 갯수를 반환하는 문제이다.
  • 이차 정사각 배열의 한 변의 원소수가 2의 제곱수 형태로 표현되기 때문에 주어진 arr배열의 길이를 구하고 그 길이와 압축여부를 확인하는 시작점의 좌표를 인자로 받는 함수를 구현한다. 그리고 길이 n에 해당하는 판의 원소들을 지속적으로 살피면서 시작 원소와 다를 경우 재귀함수를 통하여 4분면의 네 면적을 다시 확인한다. 그렇게 단위원소까지 확인되면 return을 통하여 재귀함수를 탈출하며 한 판에서 끝에 다다랐을 경우에는 0 또는 1에 해당하는 개수를 올려준다.

코드 & 설명

def solution(arr):
    answer = [0,0]
    n=len(arr)
    def comp(x, y, n):
        tmp = arr[x][y]
        for i in range(x, x+n):
            for j in range(y, y+n):
                if tmp != arr[i][j]:
                    n//=2
                    comp(x, y, n)
                    comp(x, y+n, n)
                    comp(x+n, y, n)
                    comp(x+n, y+n, n)
                    return
        answer[tmp]+=1
    comp(0,0,n)
    return answer
728x90