์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[QUADTREE] ์ฟผ๋“œ ํŠธ๋ฆฌ ๋’ค์ง‘๊ธฐ

YURI๐Ÿ•๐Ÿ“๐Ÿถ 2019. 8. 22. 16:11
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

๋Œ€๋Ÿ‰์˜ ์ขŒํ‘œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์— ์••์ถ•ํ•ด ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋ฒ• ์ค‘ ์ฟผ๋“œ ํŠธ๋ฆฌ(quad tree)๋ž€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ณต๊ฐ„์„ ํ•ญ์ƒ 4๊ฐœ๋กœ ๋ถ„ํ• ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋“œ ํŠธ๋ฆฌ๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ˆ๋Š”๋ฐ, ์ด์˜ ์œ ๋ช…ํ•œ ์‚ฌ์šฉ์ฒ˜ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฒ€์€ ์ƒ‰๊ณผ ํฐ ์ƒ‰๋ฐ–์— ์—†๋Š” ํ‘๋ฐฑ ๊ทธ๋ฆผ์„ ์••์ถ•ํ•ด ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฟผ๋“œ ํŠธ๋ฆฌ๋Š” 2N × 2N ํฌ๊ธฐ์˜ ํ‘๋ฐฑ ๊ทธ๋ฆผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋ฌธ์ž์—ด๋กœ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ๊ทธ๋ฆผ์˜ ๋ชจ๋“  ํ”ฝ์…€์ด ๊ฒ€์€ ์ƒ‰์ผ ๊ฒฝ์šฐ ์ด ๊ทธ๋ฆผ์˜ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ• ๊ฒฐ๊ณผ๋Š” ๊ทธ๋ฆผ์˜ ํฌ๊ธฐ์— ๊ด€๊ณ„์—†์ด b๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ทธ๋ฆผ์˜ ๋ชจ๋“  ํ”ฝ์…€์ด ํฐ ์ƒ‰์ผ ๊ฒฝ์šฐ ์ด ๊ทธ๋ฆผ์˜ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ• ๊ฒฐ๊ณผ๋Š” ๊ทธ๋ฆผ์˜ ํฌ๊ธฐ์— ๊ด€๊ณ„์—†์ด w๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํ”ฝ์…€์ด ๊ฐ™์€ ์ƒ‰์ด ์•„๋‹ˆ๋ผ๋ฉด, ์ฟผ๋“œ ํŠธ๋ฆฌ๋Š” ์ด ๊ทธ๋ฆผ์„ ๊ฐ€๋กœ ์„ธ๋กœ๋กœ ๊ฐ๊ฐ 2๋“ฑ๋ถ„ํ•ด 4๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ์ชผ๊ฐ  ๋’ค ๊ฐ๊ฐ์„ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ „์ฒด ๊ทธ๋ฆผ์˜ ์••์ถ• ๊ฒฐ๊ณผ๋Š” x(์™ผ์ชฝ ์œ„ ๋ถ€๋ถ„์˜ ์••์ถ• ๊ฒฐ๊ณผ)(์˜ค๋ฅธ์ชฝ ์œ„ ๋ถ€๋ถ„์˜ ์••์ถ• ๊ฒฐ๊ณผ)(์™ผ์ชฝ ์•„๋ž˜ ๋ถ€๋ถ„์˜ ์••์ถ• ๊ฒฐ๊ณผ)(์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋ถ€๋ถ„์˜ ์••์ถ• ๊ฒฐ๊ณผ)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ทธ๋ฆผ (a)์˜ ์™ผ์ชฝ ์œ„ 4๋ถ„๋ฉด์€ xwwwb๋กœ ์••์ถ•๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ (a)์™€ ๊ทธ๋ฆผ (b)๋Š” 16×16 ํฌ๊ธฐ์˜ ์˜ˆ์ œ ๊ทธ๋ฆผ์„ ์ฟผ๋“œ ํŠธ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•ด ์••์ถ•ํ•˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋•Œ ์ „์ฒด ๊ทธ๋ฆผ์˜ ์••์ถ• ๊ฒฐ๊ณผ๋Š” xxwww bxwxw bbbww xxxww bbbww wwbb๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ฟผ๋“œ ํŠธ๋ฆฌ๋กœ ์••์ถ•๋œ ํ‘๋ฐฑ ๊ทธ๋ฆผ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ๊ทธ๋ฆผ์„ ์ƒํ•˜๋กœ ๋’ค์ง‘์€ ๊ทธ๋ฆผ ์„ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ•ํ•ด์„œ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

์ž…๋ ฅ

์ฒซ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ C (C≤50)๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ ํ›„ C์ค„์— ํ•˜๋‚˜์”ฉ ์ฟผ๋“œ ํŠธ๋ฆฌ๋กœ ์••์ถ•ํ•œ ๊ทธ๋ฆผ์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 1,000 ์ดํ•˜์ด๋ฉฐ, ์›๋ณธ ๊ทธ๋ฆผ์˜ ํฌ๊ธฐ๋Š” 220 × 220 ์„ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋‹น ํ•œ ์ค„์— ์ฃผ์–ด์ง„ ๊ทธ๋ฆผ์„ ์ƒํ•˜๋กœ ๋’ค์ง‘์€ ๊ฒฐ๊ณผ๋ฅผ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ•ํ•ด์„œ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ

4
w
xbwwb
xbwxwbbwb
xxwwwbxwxwbbbwwxxxwwbbbwwwwbb

์˜ˆ์ œ ์ถœ๋ ฅ

w
xwbbw
xxbwwbbbw
xxwbxwwxbbwwbwbxwbwwxwwwxbbwb

๋ฌธ์ œ ํ’€์ด

์ฟผ๋“œ ํŠธ๋ฆฌ๋Š” ์ฃผ์–ด์ง„ ๊ณต๊ฐ„์„ ํ•ญ์ƒ 4๊ฐœ๋กœ ๋ถ„ํ• ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์ด์˜ ์œ ๋ช…ํ•œ ์‚ฌ์šฉ์ฒ˜๋Š” ํ•˜๋‚˜๋Š” ํฐ ์ƒ‰๊ณผ ๊ฒ€์€ ์ƒ‰๋ฐ–์— ์—†๋Š” ํ‘๋ฐฑ ๊ทธ๋ฆผ์„ ์••์ถ•ํ•ด ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ.

  • ๊ทธ ๋ถ€๋ถ„์˜ ๋ชจ๋“  ํ”ฝ์…€์ด ๊ฒ€์€ ์ƒ‰์ด๋ฉด ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ• ๊ฒฐ๊ณผ๋Š” b์ด๋‹ค.
  • ๊ทธ ๋ถ€๋ถ„์˜ ๋ชจ๋“  ํ”ฝ์…€์ด ํฐ ์ƒ‰์ผ ๊ฒฝ์šฐ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ• ๊ฒฐ๊ณผ๋Š” w์ด๋‹ค.
  • ๋ชจ๋“  ํ”ฝ์…€์ด ๊ฐ™์€ ์ƒ‰์ด ์•„๋‹ˆ๋ผ๋ฉด, ์ฟผ๋“œ ํŠธ๋ฆฌ๋Š” ์ด ๊ทธ๋ฆผ์„ ๊ฐ€๋กœ ์„ธ๋กœ๋กœ ๊ฐ๊ฐ 2๋“ฑ๋ถ„ํ•ด 4๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ์ชผ๊ฐ  ๋’ค ๊ฐ๊ฐ์„ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ• ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ „์ฒด ๊ทธ๋ฆผ์˜ ์••์ถ• ๊ฒฐ๊ณผ๋Š” x(์™ผ์ชฝ ์œ„)(์˜ค๋ฅธ์ชฝ ์œ„)(์™ผ์ชฝ ์•„๋ž˜)(์˜ค๋ฅธ์ชฝ ์•„๋ž˜)๊ฐ€ ๋œ๋‹ค.

๋ถ„ํ•  ์ •๋ณต์ด ์žฌ๊ท€ ํ˜ธ์ถœ๊ณผ ๋‹ค๋ฅธ ์ ์€ ๋ฌธ์ œ๋ฅผ ํ•œ ์กฐ๊ฐ๊ณผ ๋‚˜๋จธ์ง€ ์ „์ฒด๋กœ ๋‚˜๋ˆ„๋Š” ๋Œ€์‹  ๊ฑฐ์˜ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์ž…๋ ฅ ๋ฐ›์€ ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ•์„ ํ’€์–ด ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ์ƒํ•˜ ๋ฐ˜์ „ ํ•œ ํ›„ ๋‹ค์‹œ ์••์ถ• ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ ์ž…๋ ฅํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ํฌ๊ฒŒ ๋“ค์–ด์˜ฌ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ์‹์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚  ํ™•๋ฅ ์ด ๋†’๋‹ค.

1. ์ฟผ๋“œ ํŠธ๋ฆฌ ์••์ถ• ํ’€๊ธฐ

๋ฌธ์ž์—ด s์ด ์••์ถ•์„ ํ•ด์ œํ•ด์„œ nxn ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜ decompress๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

p.193

2. ์••์ถ•์„ ๋‹ค ํ’€์ง€ ์•Š๊ณ  ๋’ค์ง‘๊ธฐ

1๋ฒˆ ๋ฐฉ๋ฒ•์€ ์••์ถ•์„ ํ•ด์ œํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค ์ €์žฅํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ทธ๋ฆผ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง„๋‹ค๋ฉด ์—„์ฒญ๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ๋’ค์ง‘์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค.

์ „์ฒด๊ฐ€ ํ•œ ๊ฐ€์ง€ ์ƒ‰์ด ์•„๋‹ˆ๋ผ๋ฉด ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด ๋„ค ๋ถ€๋ถ„์„ ๊ฐ๊ฐ ์ƒํ•˜๋กœ ๋’ค์ง‘์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์€ ๋’ค, ์ด๋ฅผ ๋ณ‘ํ•ฉํ•ด ๋‹ต์„ ์–ป์œผ๋ฉด ๋œ๋‹ค.

์ด๋•Œ ๋ณ‘ํ•ฉํ• ๋•Œ 4๊ฐ€์ง€ ๋ถ€๋ถ„์„ ๋ชจ๋‘ ๋’ค์ง‘์€ ํ›„ ์œ„ ๋‘ ์กฐ๊ฐ๊ณผ ์•„๋ž˜ ๋‘ ์กฐ๊ฐ์„ ๊ฐ๊ฐ ๋ฐ”๊พธ๋ฉด ์ „์ฒด๋ฅผ ํ•œ๋ฒˆ์— ์ƒํ•˜๋กœ ๋’ค์ง‘์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>
#include <string>
using namespace std;

string reverse(string::iterator &it) {
	char head = *(it++); // iter์˜ ์ฒซ๋ฒˆ์งธ ๊ธ€์ž ํŒ๋‹จ
	if (head == 'b' || head == 'w') { // ๋’ค์ง‘์–ด๋„ ๋™์ผ
		return string(1,head);
	}
	// ๋‹ค์‹œ 4๋“ฑ๋ถ„ํ•ด์„œ ํ‘œํ˜„
		string upperLeft = reverse(it);
		string upperRight = reverse(it);
		string lowerLeft = reverse(it);
		string lowerRight = reverse(it);
	
	return string("x") + lowerLeft + lowerRight + upperLeft + upperRight;
}
int main() {
	int case_test;
	cin >> case_test;
	while (case_test!=0) {
		string str;
		cin >> str;
		string::iterator it = str.begin();
		cout << reverse(it) << endl;
		case_test--;
	}
}

iterator๋ฅผ ์ด์šฉํ•ด์„œ ์ž…๋ ฅ ๋ฐ›์€ string์„ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•˜๋ฉฐ ๋’ค์ง‘๋Š”๋‹ค.

๋ฌธ์ž์—ด์ด x๋ผ๋ฉด ์ž์‹์ด 4๊ฐœ์ธ tree๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. x๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด b, w๋Š” ์ƒํ•˜ ๋ฐ˜์ „ํ•ด๋„ ๋™์ผํ•จ์œผ๋กœ ๊ทธ๋ƒฅ ์ž…๋ ฅํ•œ๋‹ค.

x๋ผ๋ฉด 2๋“ฑ๋ถ„ํ•ด ์™ผ์ชฝ ์œ„, ์™ผ์ชฝ ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋กœ ๋‚˜๋ˆˆ ํ›„ x๊ฐ€ ์•ˆ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๊ทธ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.  ๊ทธ ํ›„ ๊ทธ string์„ ๋‹ค์‹œ ๋ฐ˜์ „ํ•˜์—ฌ ํ•ฉ์ณ์ฃผ๋ฉด ๋œ๋‹ค.


์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ๋จธ๋ฆฌ๋กœ๋Š” ํ˜ผ์ž ๋ชป ๋งŒ๋“ค์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค,, ํž˜๋“œ๋   

 

 

 

๋ฐ˜์‘ํ˜•