STUDY/Algorithm

[프로그래머스] 쿼드압축 후 개수 세기, 월간 코드 챌린지 시즌1, python

sinawi95 2021. 7. 18. 23:29
728x90

https://programmers.co.kr/learn/courses/30/lessons/68936?language=python3 

 

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

[[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

def solution(arr):
    # 분할 정복
    answer = devideAndConquer(0,0,arr,len(arr))
    return answer

def devideAndConquer(r, c, arr, size):
    if len(arr) == 1:
        return [0, 1] if arr[r][c] else [1, 0]
    
    if check(r, c, arr, size):
        return [0, 1] if arr[r][c] else [1, 0]
    
    tmp1 = devideAndConquer(r, c, arr, size//2)
    tmp2 = devideAndConquer(r, c + size//2, arr, size//2)
    tmp3 = devideAndConquer(r + size//2, c, arr, size//2)
    tmp4 = devideAndConquer(r + size//2, c + size//2, arr, size//2)
    
    ret = [0, 0]
    ret[0] = tmp1[0] + tmp2[0] + tmp3[0] + tmp4[0]
    ret[1] = tmp1[1] + tmp2[1] + tmp3[1] + tmp4[1]
    return ret 
    

def check(r, c, arr, size):
    tmp = arr[r][c]
    for i in range(r, r + size):
        for j in range(c, c + size):
            if arr[i][j] != tmp:
                return False
    return True

level2 문제로 분할정복을 알면 쉽게 풀수 있는 문제이다.

분할정복은 top down방식인데 bottom up 방식으로도 풀 수 있는 문제이다.

 

다음은 분할정복으로 푸는 문제이다.

https://sinawi.tistory.com/308

 

[백준] 1992 쿼드트리 python

https://www.acmicpc.net/problem/1992 1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N.

sinawi.tistory.com

https://sinawi.tistory.com/293

 

[백준] 1629 곱셈 python

www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net # 분할정복 import sys; input = sy..

sinawi.tistory.com

https://sinawi.tistory.com/335

 

[백준] 1780 종이의 개수, python

https://www.acmicpc.net/problem/1780 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고

sinawi.tistory.com

https://sinawi.tistory.com/279

 

[백준] 2630 색종이 만들기 python

www.acmicpc.net/problem/2630 2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터..

sinawi.tistory.com