본문 바로가기
프로그래머스/Python

[프로그래머스] 쿼드압축 후 개수 세기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 10. 18.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 배열을 압축 가능할 때까지 나누고 압축이 가능하다면 압축한 후 최종 압축한 결과에서 0과 1의 개수를 구하는 문제이다.

배열 안의 모든 원소의 값이 동일해야 해당 배열(구간)을 압축할 수 있다.

만약 압축이 불가능하다면 4개의 균일한 정사각형 영역으로 나눈 뒤, 각 영역별로 압축을 진행한다.

 

  1. 배열을 입력받아 압축한 결과를 반환하는 함수를 생성한다. def check(array)
  2. 입력받은 배열의 전체 원소의 개수를 저장한다. size = sum(list(len(i) for i in array))
  3. 만약 전체 원소가 0이면 if (sum(list(i.count(0) for i in array)) == size)
  4. 압축한 결과가 0이므로 최종 0의 개수를 증가시킨다. answer[0] += 1
  5. 만약 전체 원소가 1이면 elif (sum(list(i.count(1) for i in array)) == size)
  6. 압축한 결과가 1이므로 최종 1의 개수를 증가시킨다. answer[1] += 1
  7. 만약 압축이 불가능하다면 else
  8. 해당 배열을 4개의 구간으로 나누어 다시 압축한다.
  9. 행 0 ~ n//2, 열 0 ~ n//2 구역 arr1 = list(array[i][ : len(array) // 2] for i in range(len(array) // 2))
  10. 행 0 ~ n//2, 열 n//2 ~ n 구역 arr2 = list(array[i][len(array) // 2: ] for i in range(len(array) // 2))
  11. 행 n//2 ~ n, 열 0 ~ n//2 구역 arr3 = list(array[i][ : len(array) // 2] for i in range(len(array) // 2, len(array)))
  12. 행 n//2 ~ n, 열 n//2 ~ n 구역 arr4 = list(array[i][len(array) // 2: ] for i in range(len(array) // 2, len(array)))
  13. 균일하게 나눈 4개의 구역을 각각 압축한다. check(arr1)  check(arr2)  check(arr3)  check(arr4)
  14. 원래 초기 배열을 압축하고 난 최종 결과에서의 0과 1의 개수를 구한다. check(arr)
반응형

3. 소스코드

def solution(arr):
    answer = [0, 0]
        
    def check(array):
        size = sum(list(len(i) for i in array))
        if (sum(list(i.count(0) for i in array)) == size):
            answer[0] += 1
        elif (sum(list(i.count(1) for i in array)) == size):
            answer[1] += 1
        else:
            arr1 = list(array[i][ : len(array) // 2] for i in range(len(array) // 2))
            arr2 = list(array[i][len(array) // 2: ] for i in range(len(array) // 2))
            arr3 = list(array[i][ : len(array) // 2] for i in range(len(array) // 2, len(array)))
            arr4 = list(array[i][len(array) // 2: ] for i in range(len(array) // 2, len(array)))
            
            check(arr1) 
            check(arr2) 
            check(arr3) 
            check(arr4) 

    check(arr)
    
    return answer
728x90
반응형