7.2 ๋ฌธ์ : ์ฟผ๋ ํธ๋ฆฌ ๋ค์ง๊ธฐ (๋ฌธ์ ID:QUADTREE, ๋์ด๋: ํ)
๋๋์ ์ขํ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์์ ์์ถํด ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ธฐ๋ฒ ์ค ์ฟผ๋ ํธ๋ฆฌ๋ ๊ฒ์ด ์์ต๋๋ค. ์ฃผ์ด์ง ๊ณต๊ฐ์ ํญ์ 4๊ฐ๋ก ๋ถํ ํด ์ฌ๊ท์ ์ผ๋ก ํํํ๊ธฐ ๋๋ฌธ์ ์ฟผ๋ ํธ๋ฆฌ๋ผ๋ ์ด๋ฆ์ด ๋ถ์๋๋ฐ, ์ด์ ์ ๋ช ํ ์ฌ์ฉ์ฒ ์ค ํ๋๋ ๊ฒ์ ์๊ณผ ํฐ ์๋ฐ์ ์๋ ํ๋ฐฑ ๊ทธ๋ฆผ์ ์์ถํด ํํํ๋ ๊ฒ์ ๋๋ค.
์ฟผ๋ ํธ๋ฆฌ๋ 2^N*2^N ํฌ๊ธฐ์ ํ๋ฐฑ ๊ทธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ฌธ์์ด๋ก ์์ถํฉ๋๋ค.
-
์ด ๊ทธ๋ฆผ์ ๋ชจ๋ ํฝ์ ์ด ๊ฒ์ ์์ผ ๊ฒฝ์ฐ ์ด ๊ทธ๋ฆผ์ ์ฟผ๋ ํธ๋ฆฌ ์์ถ ๊ฒฐ๊ณผ๋ ๊ทธ๋ฆผ์ ํฌ๊ธฐ์ ๊ด๊ณ์์ด b๊ฐ ๋ฉ๋๋ค.
-
์ด ๊ทธ๋ฆผ์ ๋ชจ๋ ํฝ์ ์ด ํฐ ์์ผ ๊ฒฝ์ฐ ์ด ๊ทธ๋ฆผ์ ์ฟผ๋ ํธ๋ฆฌ ์์ถ ๊ฒฐ๊ณผ๋ ๊ทธ๋ฆผ์ ํฌ๊ธฐ์ ๊ด๊ณ์์ด w๊ฐ ๋ฉ๋๋ค.
-
๋ชจ๋ ํฝ์ ์ด ๊ฐ์ ์์ด ์๋๋ผ๋ฉด, ์ฟผ๋ ํธ๋ฆฌ๋ ์ด ๊ทธ๋ฆผ์ ๊ฐ๋ก ์ธ๋ก๋ก ๊ฐ๊ฐ 2๋ฑ๋ถํด 4๊ฐ์ ์กฐ๊ฐ์ผ๋ก ์ชผ๊ฐ ๋ค ๊ฐ๊ฐ์ ์ฟผ๋ ํธ๋ฆฌ ์์ถํฉ๋๋ค. ์ด๋ ์ ์ฒด ๊ทธ๋ฆผ์ ์์ถ ๊ฒฐ๊ณผ๋ x(์ผ์ชฝ ์ ๋ถ๋ถ์ ์์ถ ๊ฒฐ๊ณผ)(์ค๋ฅธ์ชฝ ์ ๋ถ๋ถ์ ์์ถ ๊ฒฐ๊ณผ)(์ผ์ชฝ ์๋๋ถ๋ถ์ ์์ถ ๊ฒฐ๊ณผ)(์ค๋ฅธ์ชฝ ์๋๋ถ๋ถ์ ์์ถ ๊ฒฐ๊ณผ)๊ฐ ๋ฉ๋๋ค.
์ฟผ๋ ํธ๋ฆฌ๋ก ์์ถ๋ ํ๋ฐฑ ๊ทธ๋ฆผ์ด ์ฃผ์ด์ก์ ๋, ์ด ๊ทธ๋ฆผ์ ์ํ๋ก ๋ค์ง์ ๊ทธ๋ฆผ์ ์ฟผ๋ ํธ๋ฆฌ ์์ถํด์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ ํ
ํ๋ก๊ทธ๋จ์ 1์ด ์์ ์คํ๋์ด์ผ ํ๋ฉฐ, 64MB ์ดํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ ๋ ฅ
์ฒซ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ C(C<=50)๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ทธ ํ C์ค์ ํ๋์ฉ ์ฟผ๋ ํธ๋ฆฌ๋ก ์์ถํ ๊ทธ๋ฆผ์ด ์ฃผ์ด์ง๋๋ค. ๋ชจ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ 1,000 ์ดํ์ด๋ฉฐ, ์๋ณธ ๊ทธ๋ฆผ์ ํฌ๊ธฐ๋ 2^(20)X2^(20)์ ๋์ง ์์ต๋๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋น ํ ์ค์ ์ฃผ์ด์ง ๊ทธ๋ฆผ์ ์ํ๋ก ๋ค์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ฟผ๋ ํธ๋ฆฌ ์์ถํด์ ์ถ๋ ฅํฉ๋๋ค.
๋์ ๋ต
testcase = int(input())
result = list()
def imageCom(img_str): #์ด๋ฏธ์ง ํด์ ํ arr๋ก ๋ง๋ค๊ธฐ
result_str = list()
index = 0
for i in range(0,4):
if img_str[i]=="x":
tmp_res,tmp_img =imageCom(img_str[i+1:])
result_str.append(tmp_res)
img_str=img_str[:i+1]+tmp_img
else:
result_str.append(img_str[i])
index+=1
img_str=img_str[4:]
return result_str, img_str
def switching(arr):
tmp = arr[0]
arr[0]= arr[2]
arr[2]=tmp
tmp = arr[1]
arr[1]= arr[3]
arr[3]=tmp
return arr
def upsideDown(img_arr): # ์ํ ๋ค์ง๊ธฐ
for i in range(0,4):
if isinstance(img_arr[i],list):
img_arr[i] = upsideDown(img_arr[i])
return switching(img_arr)
def arrToString(array): # ๊ฒฐ๊ณผ ์ถ๋ ฅ์ ์ํด ๋ฌธ์์ด๋ก ๋ฐ๊พธ๊ธฐ
tmp = str()
for arr in array:
if isinstance(arr,list):
tmp+='x'+arrToString(arr)
else:
tmp+=str(arr)
return tmp
for case in range(0,testcase):
imageStr = input()
if len(imageStr)==1:
result.append(imageStr)
continue
tmp, nope = imageCom(imageStr[1:])
result.append('x'+arrToString(upsideDown(tmp)))
for res in result:
print(res)
๊ณง์ด ๊ณง๋๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ผ์ผ๋ ์ฑ ๊ณผ ๋ค๋ฅธ ์ ์ ์ ์ฒด ๋ฐฐ์ด์ด ์๋ python list๋ก ๊ฐ๋จํ๊ฒ ํํํ์๋ค๋ ์ ์ด๋ค.
์๊ฐ ๋ณต์ก๋
์ต์ ์ ๊ฒฝ์ฐ 1000 ๊ธธ์ด์ ๋ฌธ์์ด๊ณผ 50๊ฐ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ์กด์ฌํ๊ณ , 2^(20)X2^(20)๊ฐ์ ๋ชจ๋ ํฝ์ ์ด ์ง๊ทธ์ฌ๊ทธ ํ๋ฐฑ์ผ๋ก ์กด์ฌํ ๋์ด๋ค. ์๊ฐ ๋ณต์ก๋๋ 50*20*1000*2 ์ด๊ณ ๊ฐ๋จํ ๋ํ๋ด๋ฉด 200000์ด๋ค. 1์ต(10^8)๋ณด๋ค ํจ์ฌ ๋ฎ์ ์์ด๋ฏ๋ก ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ง์ ์ฌ๋ณด์์ ๋๋ 2^(5) ๊น์ด์์ 0.02s๊ฐ ๋์๋ค.
๋ฉ๋ชจ๋ฆฌ
์ฑ ์ ์๋ ์์ ๋ก ํ ์คํธ ํด๋ณด์์ ๋ 0.03s 9176KB์ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์๋์๋ค.
Comment