반응형
https://school.programmers.co.kr/learn/courses/30/lessons/68936
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
package Programmers; public class 쿼드압축후개수세기 { public static void main(String[] args){ 쿼드압축후개수세기 T = new 쿼드압축후개수세기(); int[][] arr = {{1,1,0,0},{1,0,0,0},{1,0,0,1},{1,1,1,1}}; T.solution(arr); } static int[] answer = new int[2]; public int[] solution(int[][] arr) { int totSize = arr.length; dq(0,0, totSize, arr); return answer; } public void dq(int stX, int stY, int size, int[][] arr){ if(check(stX, stY, size, arr)){ //arr[stX][stY] 가 0이거나 1일때 answer에 카운팅해준다. answer[arr[stX][stY]]++; return; } //2사분면 dq(stX, stY, size / 2, arr); //1사분면 dq(stX + size / 2, stY, size / 2, arr); //3사분면 dq(stX, stY + size / 2, size / 2, arr); //4사분면 dq(stX + size / 2, stY + size / 2, size / 2, arr); } public boolean check(int x, int y, int size, int[][] arr){ for (int i = x; i < x + size; i++) { for (int j = y; j < y + size; j++) { if(arr[x][y] != arr[i][j]) return false; } } return true; } }
1. 풀이
- 분할정복 알고리즘으로 접근
- 1사분면 ~ 4사분면으로 나누는 재귀
- check 는 나눠진 사분면에서 하나라도 틀린게 있다면 false 반환한다.
check 가 참이면 나눠진 사분면안에 모든값들은 같은값이기 때문에 answer에 값을 더해준다.
- 사분면이 나눠지면 그안에서도 1~4분면까지 나눠지게 되고 계속 재귀로 푼다.
answer의 0번 인덱스는 0의 개수가 들어가고
1번 인덱스는 1의 개수가 들어간다.
※ 참고

보기 편하게 사분면으로 주석달아놓음 1사분면은 11시방향이 아니라 1시방향부터 시계방향으로 4분면까지 있으니 참고
반응형
'기타 > 알고리즘' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 최소값만들기 Lv02 Java (0) | 2023.07.04 |
---|---|
[알고리즘] 프로그래머스 - 타겟넘버 LV02 Java (0) | 2023.07.04 |
[알고리즘] 프로그래머스 - 약수의개수와덧셈 Lv1 Java (0) | 2023.06.08 |
[알고리즘] 프로그래머스 - 최소직사강형 Lv1 Java (0) | 2023.05.29 |
[알고리즘] 프로그래머스 - 모음사전 Lv2 Java DFS (0) | 2023.05.27 |