💡Problem Solving/Programmers
[프로그래머스] 쿼드 압축 후 개수 세기 (Java)
gom20
2021. 11. 23. 22:26
문제
https://programmers.co.kr/learn/courses/30/lessons/68936
코딩테스트 연습 - 쿼드압축 후 개수 세기
[[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
풀이
대표적인 분할 정복 문제로, 재귀 함수를 사용하여 작게 쪼개면서 푼다.
아래와 백준 문제와 풀이가 동일하다.
2021.11.16 - [Problem Solving/BOJ] - [BOJ 2630] 색종이 만들기 (Java)
[BOJ 2630] 색종이 만들기 (Java)
문제 https://www.acmicpc.net/problem/2630 2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색..
gom20.tistory.com
소스코드
class Solution {
public int oneCnt;
public int zeroCnt;
public int[] solution(int[][] arr) {
int[] answer = {};
oneCnt = 0;
zeroCnt = 0;
recur(arr, 0, 0, arr.length);
return new int[]{zeroCnt, oneCnt};
}
public void recur(int[][] arr, int x, int y, int n){
int tempOneCnt = 0;
for(int i = x; i < x+n; i++){
for(int j = y; j < y+n; j++){
if(arr[i][j] == 1) tempOneCnt++;
}
}
if(tempOneCnt == n*n){
oneCnt++;
} else if(tempOneCnt == 0){
zeroCnt++;
} else {
recur(arr, x, y, n/2); // up-left
recur(arr, x, y+n/2, n/2); // up-right
recur(arr, x+n/2, y, n/2); // down-left
recur(arr, x+n/2, y+n/2, n/2); // down-right
}
}
}