๋ฌธ์
๋๋์ ์ขํ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์์ ์์ถํด ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ธฐ๋ฒ ์ค ์ฟผ๋ ํธ๋ฆฌ(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์ ๋ค์ ๋ฐ์ ํ์ฌ ํฉ์ณ์ฃผ๋ฉด ๋๋ค.
์ฝ๋๊ฐ ๋งค์ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ ์ฝ๋๋ค. ํ์ง๋ง ๋ด ๋จธ๋ฆฌ๋ก๋ ํผ์ ๋ชป ๋ง๋ค์์ ๊ฒ ๊ฐ๋ค,, ํ๋๋