[python] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต 1๊ถŒ :: ์ฟผ๋“œ ํŠธ๋ฆฌ ๋’ค์ง‘๊ธฐ (189p) ๋ฌธ์ œ

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์˜ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ์š”๋˜์—ˆ๋‹ค.

๋ฐ˜์‘ํ˜•