[python]๋ฐฑ์ค€ 1992๋ฒˆ : ์ฟผ๋“œํŠธ๋ฆฌ

https://www.acmicpc.net/problem/1992

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 128 MB 10660 6114 4794 57.420%

๋ฌธ์ œ

ํ‘๋ฐฑ ์˜์ƒ์„ ์••์ถ•ํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์ฟผ๋“œ ํŠธ๋ฆฌ(Quad Tree)๋ผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํฐ ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” 0๊ณผ ๊ฒ€์€ ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” 1๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์˜์ƒ(2์ฐจ์› ๋ฐฐ์—ด)์—์„œ ๊ฐ™์€ ์ˆซ์ž์˜ ์ ๋“ค์ด ํ•œ ๊ณณ์— ๋งŽ์ด ๋ชฐ๋ ค์žˆ์œผ๋ฉด, ์ฟผ๋“œ ํŠธ๋ฆฌ์—์„œ๋Š” ์ด๋ฅผ ์••์ถ•ํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์–ด์ง„ ์˜์ƒ์ด ๋ชจ๋‘ 0์œผ๋กœ๋งŒ ๋˜์–ด ์žˆ์œผ๋ฉด ์••์ถ• ๊ฒฐ๊ณผ๋Š” "0"์ด ๋˜๊ณ , ๋ชจ๋‘ 1๋กœ๋งŒ ๋˜์–ด ์žˆ์œผ๋ฉด ์••์ถ• ๊ฒฐ๊ณผ๋Š” "1"์ด ๋œ๋‹ค. ๋งŒ์•ฝ 0๊ณผ 1์ด ์„ž์—ฌ ์žˆ์œผ๋ฉด ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๋‚˜ํƒ€๋‚ด์ง€๋ฅผ ๋ชปํ•˜๊ณ , ์™ผ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์œ„, ์™ผ์ชฝ ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜, ์ด๋ ‡๊ฒŒ 4๊ฐœ์˜ ์˜์ƒ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์••์ถ•ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด 4๊ฐœ์˜ ์˜์—ญ์„ ์••์ถ•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ด„ํ˜ธ ์•ˆ์— ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•œ๋‹ค

img

์œ„ ๊ทธ๋ฆผ์—์„œ ์™ผ์ชฝ์˜ ์˜์ƒ์€ ์˜ค๋ฅธ์ชฝ์˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ์ˆซ์ž๋กœ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ์˜์ƒ์„ ์ฟผ๋“œ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์••์ถ•ํ•˜๋ฉด "(0(0011)(0(0111)01)1)"๋กœ ํ‘œํ˜„๋œ๋‹ค. N ×N ํฌ๊ธฐ์˜ ์˜์ƒ์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ์˜์ƒ์„ ์••์ถ•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์˜์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž N ์ด ์ฃผ์–ด์ง„๋‹ค. N ์€ ์–ธ์ œ๋‚˜ 2์˜ ์ œ๊ณฑ์ˆ˜๋กœ ์ฃผ์–ด์ง€๋ฉฐ, 1≤N ≤64์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ๋Š” ๊ธธ์ด N ์˜ ๋ฌธ์ž์—ด์ด N ๊ฐœ ๋“ค์–ด์˜จ๋‹ค. ๊ฐ ๋ฌธ์ž์—ด์€ 0 ๋˜๋Š” 1์˜ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์˜์ƒ์˜ ๊ฐ ์ ๋“ค์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ถœ๋ ฅ

์˜์ƒ์„ ์••์ถ•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋‚˜์˜ ๋‹ต

size = int(input())
input_arr = list()

for i in range(0,size):
    input_arr.append(list(map(int,input())))

def arrPosition(arr,type): 
#์™ผ์œ„, ์˜ค์œ„, ์™ผ์•„, ์˜ค์•„ ์ˆœ์œผ๋กœ 1234
# ์›ํ•˜๋Š” ๋ถ€๋ถ„์˜ arr return
    tmp_arr = list()
    if type==1:
        for i in range(0,len(arr)//2):
            tmp=list()
            for j in range(0,len(arr)//2):
                tmp.append(arr[i][j])
            tmp_arr.append(tmp)
    elif type==3:
        for i in range(len(arr)//2,len(arr)):
            tmp=list()
            for j in range(0,len(arr)//2):
                tmp.append(arr[i][j])
            tmp_arr.append(tmp)
    elif type==2:
        for i in range(0,len(arr)//2):
            tmp=list()
            for j in range(len(arr)//2,len(arr)):
                tmp.append(arr[i][j])
            tmp_arr.append(tmp)
    else:
        for i in range(len(arr)//2,len(arr)):
            tmp=list()
            for j in range(len(arr)//2,len(arr)):
                tmp.append(arr[i][j])
            tmp_arr.append(tmp)
    if len(tmp_arr)==1:
        tmp_arr=tmp_arr[0][0]
    return tmp_arr


def imgCompress(arr,size): # ์ด๋ฏธ์ง€ ์••์ถ•
    result_str = str()

    if size==1: # ๊ธฐ์ €์‚ฌ๋ก€
        return arr

    tmp = 1
    first = arr[0][0]

    for i in range(0,size):
        for j in range(0,size):
            if first!=arr[i][j]:
                tmp = 0
                break
        if not(tmp):
            break
    if tmp: # ๋ชจ๋“  ํ”ฝ์…€์˜ ์ƒ‰์ด ๊ฐ™์œผ๋ฉด
        return first
    else: # ๋‹ค๋ฅด๋ฉด
        result_str += '('
        for i in range(0,4):
            result_str +=str(imgCompress(arrPosition(arr,i+1),size//2))
        result_str += ')'
    return result_str

print(imgCompress(input_arr,size))
์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ƒฅ ์žฌ๊ท€ํ•จ์ˆ˜ ์จ์„œ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ˜„

์‹œ๊ฐ„ ๋ณต์žก๋„

์ƒ‰์ด ๊ฐ™์€ ์ง€ ํ™•์ธํ•  ๋•Œ ์ตœ๋Œ€ ์ „์ฒดํƒ์ƒ‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด N^2๊ฐœ ๋งŒํผ์„ ํƒ์ƒ‰ํ•œ๋‹ค. ์ด๋Ÿฐ ํƒ์ƒ‰์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์žˆ์ง€๋งŒ ๋‹ค ๊ณฑํ•ด์ง€๋Š” ์ƒ์ˆ˜์ด๋ฏ€๋กœ O(N^2)์ด ์‹œ๊ฐ„ ๋ณต์žก๋„์ด๋‹ค.

์‹œ๊ฐ„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ

๋ฐฑ์ค€ ์ฑ„์  ์‹œ์Šคํ…œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋Š” 29284KB, ์‹œ๊ฐ„์€ 72ms ๋‚˜์™”๋‹ค.

๋ฐ˜์‘ํ˜•