거의 알고리즘 일기장

알고스팟_쿼드 트리 뒤집기 _분할정복 본문

알고리즘 문제풀이

알고스팟_쿼드 트리 뒤집기 _분할정복

건우권 2020. 4. 22. 21:15

https://algospot.com/judge/problem/read/QUADTREE

 

algospot.com :: QUADTREE

쿼드 트리 뒤집기 문제 정보 문제 대량의 좌표 데이터를 메모리 안에 압축해 저장하기 위해 사용하는 여러 기법 중 쿼드 트리(quad tree)란 것이 있습니다. 주어진 공간을 항상 4개로 분할해 재귀적으로 표현하기 때문에 쿼드 트리라는 이름이 붙었는데, 이의 유명한 사용처 중 하나는 검은 색과 흰 색밖에 없는 흑백 그림을 압축해 표현하는 것입니다. 쿼드 트리는 2N × 2N 크기의 흑백 그림을 다음과 같은 과정을 거쳐 문자열로 압축합니다. 이 그림의 모든

algospot.com

 풀이방법

 이 문제는 무식하게 풀면 쿼드트리의 압축풀기 -> 값 뒤집기 -> 다시 압축하기 이렇게 풀수도 있지만 너무 오래걸린다.

 

 해결방법은 상하로 뒤집으면 밑의 그림처럼 된다는 것을 유의하고 압축을 풀지말고 string으로 주어진 문자열 상태에서 뒤집는 방법이다. 이러면 O(N)

상하로 뒤집혔을때

 조금더 자세하게 설명하자면 string을 조회하면서

1. 'b'나 'w'가 나오면 return 나온 문자

2. 'x'면 좌상(1), 우상(2), 좌하(3), 우하(4) 네가지 경우로 나누어 재귀를 돌린다. 

3. return 'x' + 좌하(3) + 우하(4) + 좌상(1) + 좌우(2) 

 

string getReverse(string::iterator& it)
{
	char head = *it;
	++it;
	if (head == 'b' || head == 'w')
		return string(1, head);
	string upperLeft = getReverse(it);
	string upperRight = getReverse(it);
	string lowerLeft = getReverse(it);
	string lowerRight = getReverse(it);

	return string("x") + lowerLeft + lowerRight + upperLeft + upperRight;
}

후기

나는 아직 멀었다. 맨날 모르네

반응형
Comments