ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค [lv2] ์ฟผ๋“œ์••์ถ• ํ›„ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ ํŒŒ์ด์ฌ

2021. 8. 31. 21:58ใ†๐Ÿ”ฑ Algorithm

https://programmers.co.kr/learn/courses/30/lessons/68936

 

๐Ÿ“š ์ฝ”๋“œ

// ๋‹ค๋ฅธ ๋ถ„ ํ’€์ด ์ฐธ์กฐ
def solution(arr):
    N = len(arr)
    answer = [0, 0]

    def compress(x, y, N):
        init = arr[x][y]
        for r in range(x, x + N):
            for c in range(y, y + N):
                if arr[r][c] != init:
                    N //= 2
                    compress(x, y, N)
                    compress(x, y + N, N)
                    compress(x + N, y, N)
                    compress(x + N, y + N, N)
                    return

        answer[init] += 1
    compress(0, 0, N)
    
    return answer

 

๐ŸŒ  ์ ‘๊ทผ ๋ฐฉ๋ฒ•

1. ์ „์ฒด ์‚ฌ๊ฐํ˜•์„ ์šฐ์„  ๊ธฐ์ค€์œผ๋กœ ,

2. ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์„œ๋กœ ๋™์ผํ•œ์ง€ ์ฒดํฌํ•œ๋‹ค.

3. ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋ฉด ๋ถ„๊ธฐํ•˜์—ฌ, ์ „์ฒด ์‚ฌ๊ฐํ˜•์„ ์‚ฌ๋“ฑ๋ถ„์œผ๋กœ ์ชผ๊ฐ  ํ›„ ๋„ค ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ๊ฐํ˜•์— ์ž‘๋‘ ํƒ€๋“ฏ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํƒœ์šด๋‹ค.

๊ทธ๋ฆผ ์ƒ์—์„  ํ•˜๋‚˜์˜ ์‚ฌ๊ฐํ˜•์œผ๋กœ๋งŒ ์žฌ๊ท€๋ฅผ ํƒ€๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋น„์–ด์žˆ๋Š” ๋‚˜๋จธ์ง€ ์„ธ ๋ถ€๋ถ„์œผ๋กœ๋„ ๊ฐ์ž ์žฌ๊ท€๋ฅผ ํƒœ์šฐ๋ฉด ๋œ๋‹ค.

์žฌ๊ท€๋Š” ์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ’์ด ๋™์ผํ•  ๋•Œ ๋ฉˆ์ถ”๊ณ , ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๊ฐํ˜•์— ๋„๋‹ฌํ•˜๋ฉด ํ•„์—ฐ์ ์œผ๋กœ if ์กฐ๊ฑด๋ฌธ์ด True ์ด๋ฏ€๋กœ ์žฌ๊ท€๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ•น  ์‹ค์ˆ˜ํ•œ ์ฝ”๋“œ

๋ฆฌํ„ด์„ ์ž˜๋ชป๋œ ์œ„์น˜์—์„œ ์„ ์–ธํ•ด์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, 

compress() ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์„œ return ๋ผ์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผํ•œ๋‹ค.

return ์€ if ๋ฌธ ๋‚ด๋ถ€์— ์žˆ์–ด์•ผํ•˜๋Š”๋ฐ, ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์‚ฌ๊ฐํ˜•์—์„œ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์žฌ๊ท€๋ฅผ ํƒ€๋Š” ์กฐ๊ฑด๋ฌธ์ด๋‹ค. 

์ •์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€ ๊ฐ’์ด ๋ชจ๋‘ ๊ฐ™์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์‚ฌ๊ฐํ˜•์„ ๊ธฐ์ค€์œผ๋กœ ์žฌ๊ท€๋ฅผ ํƒœ์šด ํ›„ ๋ฆฌํ„ดํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

def solution(arr):
    N = len(arr)
    answer = [0, 0]

    def compress(x, y, N):
        init = arr[x][y]
        for r in range(x, x + N):
            for c in range(y, y + N):
                if arr[r][c] != init:
                    N //= 2
                    compress(x, y, N)
                    compress(x, y + N, N)
                    compress(x + N, y, N)
                    compress(x + N, y + N, N)


        answer[init] += 1
        return   # ๋ฆฌํ„ด์ด ์—ฌ๊ธฐ์žˆ์œผ๋ฉด ์˜ค๋‹ต์ด๋‹ค.
    compress(0, 0, N)
    
    return answer