일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 백준 알고리즘
- 금융감독원 민원신청
- 겜스고
- 코드스테이츠 백엔드 부트캠프 합격
- Spring
- 코테 합격후기
- Code States 백엔드 합격 후기
- 백내장
- Java
- 메서드
- 코드스테이츠 백엔드 후기
- 코드스테이츠 합격 후기
- HLB
- 코드스테이츠 합격
- CodeState 후기
- 해시
- 코드스테이츠 부트캠프 합격 후기
- 코드스테이츠 백엔드 교육과정
- 백내장 다초점렌즈 삽입술
- 코드 스테이츠 백엔드 교육과정
- 금감원
- 에이치엘비
- 금융감독원
- codestates 국비지원 1기 합격 후기
- 금감원 백내장 민원
- 보험금 지급거절
- 백내장 금감원
- Gamsgo
- 자바
- 코드스테이츠 부트캠프
Archives
- Today
- Total
개발하는 동그리
백준 알고리즘 [분할정복] 쿼드트리_1992_실버1 본문
반응형
문제
흑백 영상을 압축하여 표현하는 데이터 구조로 쿼드 트리(Quad Tree)라는 방법이 있다. 흰 점을 나타내는 0과 검은 점을 나타내는 1로만 이루어진 영상(2차원 배열)에서 같은 숫자의 점들이 한 곳에 많이 몰려있으면, 쿼드 트리에서는 이를 압축하여 간단히 표현할 수 있다.
주어진 영상이 모두 0으로만 되어 있으면 압축 결과는 "0"이 되고, 모두 1로만 되어 있으면 압축 결과는 "1"이 된다. 만약 0과 1이 섞여 있으면 전체를 한 번에 나타내지를 못하고, 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래, 이렇게 4개의 영상으로 나누어 압축하게 되며, 이 4개의 영역을 압축한 결과를 차례대로 괄호 안에 묶어서 표현한다
위 그림에서 왼쪽의 영상은 오른쪽의 배열과 같이 숫자로 주어지며, 이 영상을 쿼드 트리 구조를 이용하여 압축하면 "(0(0011)(0(0111)01)1)"로 표현된다. N ×N 크기의 영상이 주어질 때, 이 영상을 압축한 결과를 출력하는 프로그램을 작성하시오.
체감 난이도
실버 2
문제 풀이 소감
Backtracking 알고리즘을 알고 있다면, 무난하게 풀 수 있음
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
* 흑백 영상을 압축하여 표현하는 데이터 구조 쿼드트리
* 흰점 - 0
* 검은점 - 1
*
*/
public class Main {
static int N;
static int[][] ListA;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
ListA = new int[N][N];
for (int i = 0; i < N; i++) {
String[] split = br.readLine().split("");
for (int j = 0; j < N; j++) {
ListA[i][j] = Integer.parseInt(split[j]);
}
}
backtracking(0,0, N);
System.out.println(sb);
}
static void backtracking(int x, int y, int size) {
if (checkSameColor(x, y, size)) {
sb.append(ListA[x][y]); // 영역이 모두 같은 색이면 해당 숫자 추가
return;
}
sb.append("("); // 분할 시작 표시
// 색상이 다르면 4등분으로 나눔
int newSize = size / 2; // 영역의 크기를 절반으로 줄임
backtracking(x, y, newSize); // 좌상
backtracking(x, y + newSize, newSize); // 우상
backtracking(x + newSize, y, newSize); // 좌하
backtracking(x + newSize, y + newSize, newSize); // 우하
sb.append(")"); // 분할 시작 표시
}
// 현재 영역이 모두 같은 색인지 확인
static boolean checkSameColor(int x, int y, int size) {
int color = ListA[x][y]; // 시작점의 색상
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
if (ListA[i][j] != color) {
return false; // 다른 색이 하나라도 있으면 false
}
}
}
return true; // 모두 같은 색이면 true
}
}
문제 바로가기
https://www.acmicpc.net/problem/1992
반응형
'알고리즘 > 분할정복' 카테고리의 다른 글
백준 알고리즘 [분할정복] 치킨 TOP N_11582_실버4 (1) | 2024.11.30 |
---|---|
백준 알고리즘 [분할정복] 색종이 만들기_2630_실버2 (0) | 2024.11.30 |