Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 1300번
- Design Pattern
- 1043번
- 2206번
- 2166번
- 백준
- 10830번
- 코딩테스트
- DxTrace
- Spring
- Design Patterns
- 냄새와 휴리스틱
- 자바의 정석
- programmers
- 11758번
- 9장
- BOJ
- 프로그래머스
- springboot
- SerialDate 리펙터링
- 2156번
- 11286번
- java의 정석
- Dxerr.h
- 가장 긴 증가하는 부분 수열2
- 17장
- 코딩 테스트
- Adapater Pattern
- java
- 클린코드
Archives
- Today
- Total
Don't give up!
[프로그래머스] 쿼드압축 후 개수 세기(java) 본문
코딩테스트 연습 - 쿼드압축 후 개수 세기 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
압축한 영역이 모두 같은 숫자를 가지고 있는지 확인하기 위해서는 내부의 영역이 나타내는 숫자를 확인하여야 합니다.
가장 작은 영역단위(1x1크기)부터 숫자를 파악하고, 다음 크기의 영역단위에서 4개의 영역이 같은 숫자라면 영역을 하나의 숫자로 압축시킴으로서 문제를 해결할 수 있다고 생각하였습니다.
코드
class Solution {
private int[] answer = {0,0};
private int[][] tree;
public int[] solution(int[][] arr) {
tree = arr;
quadCount(0,0,arr.length);
return answer;
}
private int quadCount(int x, int y, int size){
if(size==1){
answer[tree[x][y]]++; //최소 단위에서 결과값을++
return tree[x][y];
}
//4개의 구역으로 나눈다.
int nsize = size/2;
int lt = quadCount(x,y,nsize);
int rt = quadCount(x+nsize,y,nsize);
int lb = quadCount(x,y+nsize,nsize);
int rb = quadCount(x+nsize,y+nsize,nsize);
//4개의 구역이 공통되면 압축, 이미 압축되지 않은 구역이 있다면 압축하지 않는다.
if(lt!=-1 && lt==rt && lt==lb && lt==rb){
answer[lt]-=3;
return lt;
}else return -1;//서로 다른 값을 가지면 압축하지 않는다.
}
}
테스트를 통과하는 코드입니다.
재귀함수를 사용한 DFS로서 코드를 작성하였으며 4개의 영역이 같다면 영역이 나타내는 숫자를 반환하고 다르다면 -1을 반환함으로서 검사의 결과를 파악하였습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 카펫(java) (0) | 2021.05.17 |
---|---|
[프로그래머스] 뉴스 클러스터링(java) (0) | 2021.05.15 |
[프로그래머스] 괄호 회전하기(java) (0) | 2021.05.14 |