BOJ/๐Ÿฅˆ

โ˜…DAC ์ค‘์ƒ๊ธ‰1 - 3๋ฌธ์ œ()โ˜…

metamong 2023. 3. 20.

๐Ÿด DAC ๋ถ„ํ• ์ •๋ณต ๋ฌธ์ œ๋Š” ์ฃผ๋กœ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ sub-problem์„ ๋Œ๋ฆฌ๊ณ  ์ฐจ๋ก€์ฐจ๋ก€ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ค‘์ƒ๊ธ‰ ์ด์ƒ์˜ ๋‚œ์ด๋„๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•ด๋ณด์ž!

 

๐Ÿด ์•„๋ž˜ DAC ์ด๋ก  ํฌ์ŠคํŒ… ์ฐธ์กฐ

 

Divide&Conquer(DAC)

intro> ๐Ÿป ๋ถ„ํ• (Divide)ํ•˜๊ณ  ์ •๋ณต(Conquer)ํ•˜๋Š” ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋ถ„ํ•  → ์ •๋ณต → ๊ฒฐํ•ฉ ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋œ๋‹ค. ๐Ÿป โ‘  ๋ถ„ํ• (Divide): ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ sub-pr

sh-avid-learner.tistory.com


โ˜… 2630 ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
W,B=0,0
confetti=[]

def is_check(arr):
    side=len(arr)
    if all(arr[i][j] == 0 for i in range(side) for j in range(side)):
        return 'W'
    elif all(arr[i][j] == 1 for i in range(side) for j in range(side)):
        return 'B'
    else: return 0

def get_confetti(arr,l,W,B):
    if l == 1:
        if arr[0][0] == 0:
            W+=1
            return (W,B)
        else:
            B+=1
            return (W,B)
    else:    
        if is_check(arr) == 'W':
            W+=1
            return (W,B)
        elif is_check(arr) == 'B':
            B+=1
            return (W,B)
        else:
            border = l//2
            arr1,arr2,arr3,arr4=[],[],[],[]
            
            for i in arr[:border]:
                arr1.append(i[:border])
                arr2.append(i[border:])
            for j in arr[border:]:
                arr3.append(j[:border])
                arr4.append(j[border:])
            W,B = get_confetti(arr1,border,W,B)
            W,B = get_confetti(arr2,border,W,B)
            W,B = get_confetti(arr3,border,W,B)
            W,B = get_confetti(arr4,border,W,B)
    return (W,B)


    
for _ in range(N):
    confetti.append(list(map(int,input().split())))

l = len(confetti)

W,B = get_confetti(confetti,l,0,0)
print(W,B,sep='\n')

 

๐Ÿด ์ฃผ์–ด์ง„ ์ •์‚ฌ๊ฐํ˜•์ด ๋ชจ๋‘ 1๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€, 0์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” sub-problem์œผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•œ ๋ฒˆ ํ™•์ธ๋œ, ์ฆ‰ ํ•œ ๋ฒˆ ํ•ด๊ฒฐ๋œ sub-problem์€ ์ดํ›„ ๋‹ค์‹œ ํ’€๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ถ„ํ• ์ •๋ณต DAC ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿด ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์  - ๋™์ผ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ธ ๋•Œ๋งˆ๋‹ค, ๋ณ€์ˆ˜ W, B๊ฐ€ ๊ณ„์† ์ดˆ๊ธฐํ™”๋˜๋ฏ€๋กœ ์ƒˆ๋กญ๊ฒŒ ์ƒ๊ธฐ๋Š” sub-problem์„ ํ•ด๊ฒฐํ•  ๋•Œ๋งˆ๋‹ค W,B ๋ณ€์ˆ˜์— ๊ณ„์† updateํ•ด์ค˜์•ผ ํ•œ๋‹ค.


โ˜… 1780 ์ข…์ด์˜ ๊ฐœ์ˆ˜ โ˜…

 

import sys
input=sys.stdin.readline

N=int(input().rstrip())
papers=[list(map(int,input().split())) for _ in range(N)]

cnt_dic={'-1':0, '0':0, '1':0}
l=len(papers)

def check_the_same(arr):
    cmp=arr[0][0]
    l=len(arr)
    flag=True
    for i in range(l):
        for j in range(l):
            if arr[i][j] != cmp:
                flag = False
                return (False,2)
    if flag:
        return (True,cmp)

def cut_paper(arr,l):
    if l == 0:
        res,val=True,arr[0]
    else:
        res,val = check_the_same(arr)

    if res:
        if val == -1: cnt_dic['-1']+=1
        elif val == 0: cnt_dic['0']+=1
        else: cnt_dic['1']+=1
        return
    
    else: #if False, recursion
        #divide into 9 pieces
        l=len(arr)
        if l > 0:
            arrays=[[] for _ in range(9)]
            for i in arr[:l//3]:
                arrays[0].append(i[:l//3])
                arrays[1].append(i[l//3:(2*l)//3])
                arrays[2].append(i[(2*l)//3:l])
            
            for i in arr[l//3:(2*l)//3]:
                arrays[3].append(i[:l//3])
                arrays[4].append(i[l//3:(2*l)//3])
                arrays[5].append(i[(2*l)//3:l])

            for i in arr[(2*l)//3:l]:
                arrays[6].append(i[:l//3])
                arrays[7].append(i[l//3:(2*l)//3])
                arrays[8].append(i[(2*l)//3:l])

            for subarr in arrays:
                cut_paper(subarr,l//3)

        return
    
cut_paper(papers,len(papers))

print(cnt_dic['-1'])
print(cnt_dic['0'])
print(cnt_dic['1'])

 

๐Ÿด ์œ„์™€ ๋™์ผํ•œ ์ „ํ˜•์ ์ธ ๋ถ„ํ• ์ •๋ณต ๋ฌธ์ œ๋กœ, ๋ถ„ํ• ํ•˜๊ณ , recursion์„ ๋ฐ˜๋ณตํ•ด ์ •๋ณต ์œ ํ˜•์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

 

๐Ÿด ๋‹ค๋งŒ, arr์˜ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ์ผ ๊ฒฝ์šฐ, ๋ฐ”๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜์˜€๊ณ , ์ „์ฒด -1์˜ ๊ฐœ์ˆ˜, 0์˜ ๊ฐœ์ˆ˜, 1์˜ ๊ฐœ์ˆ˜๋ฅผ ๋งค๋ฒˆ ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ ์žฌ๊ท€ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์ง€ ์•Š์€ ๋Œ€์‹ , ๊ฐ ์ข…๋ฅ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ ์ž๋ฃŒํ˜•์œผ๋กœ ๋งŒ๋“ค์–ด ๊ฐœ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ ์ง„ํ–‰

 

๐Ÿด ์ „์ฒด arr ์ž์ฒด๋ฅผ ์ชผ๊ฐœ๊ธฐ ๋ณด๋‹ค๋Š”, indexing์œผ๋กœ arr์˜ ๊ฐ„๊ฒฉ size๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ๋” ํšจ์œจ์ ์œผ๋กœ ์งค ์ˆ˜ ์žˆ๋‹ค.

(for๋ฌธ์—์„œ arr์ž์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋ณด๋‹ค, length ์‚ฌ์ด์ฆˆ ์ž์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ธ ๊ฒƒ ์ฒ˜๋Ÿผ)


โ˜… 1074 Z โ˜…

 

import sys
N,r,c=map(int,input().split())
size = 2**N
global n
n = 0
i,j=0,0

def if_size_two(i,j):
    if (i,j) == (r,c):
        print(n)
        sys.exit()
    elif (i,j+1) == (r,c):
        print(n+1)
        sys.exit()
    elif (i+1,j) == (r,c):
        print(n+2)
        sys.exit()
    else:
        print(n+3)
        sys.exit()

def divide_into_four(i,j,size):
    global n
    if size == 2:
        if_size_two(i,j)
    else:
        #1
        if i<=r<(i+size//2) and j<=c<(j+size//2):
            divide_into_four(i,j,size//2)
        else:
            n+=((size//2)*(size//2))
		
        #2
        if i<=r<(i+size//2) and j+size//2<=c<(j+size):
            divide_into_four(i,j+size//2,size//2)
        else:
            n+=((size//2)*(size//2))
        
        #3
        if i+size//2<=r<(i+size) and j<=c<(j+size//2):
            divide_into_four(i+size//2,j,size//2)
        else:
            n+=((size//2)*(size//2))
        
        #4
        if i+size//2<=r<(i+size) and j+size//2<=c<(j+size):
            
            divide_into_four(i+size//2,j+size//2,size//2)
        else:
            n+=((size//2)*(size//2))

divide_into_four(i,j,size)

 

๐Ÿด Z ํƒ์ƒ‰ ํ๋ฆ„

→ ์œ„ ์™ผ์ชฝ → ์œ„ ์˜ค๋ฅธ์ชฝ → ์•„๋ž˜ ์™ผ์ชฝ → ์•„๋ž˜ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ ์ˆœ์„œ๋กœ ํƒ์ƒ‰์ด ์ง„ํ–‰๋œ๋‹ค.

 

๐Ÿด pseudo-code ํ๋ฆ„

โ‘  size(์ •์‚ฌ๊ฐํ˜• ํ•œ ๋ณ€์˜ ๊ธธ์ด)๊ฐ€ 2์ด๋ฉด ์œ„ Z ์ˆœ์„œ๋กœ ์ผ์น˜ํ•˜๋Š” (r,c) ํŒŒ์•…ํ•˜๊ณ  ๋ฐ”๋กœ sys.exit()์œผ๋กœ ์ข…๋ฃŒ!

โ‘ก size๊ฐ€ 2๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด 4๋“ฑ๋ถ„ → Z ์ˆœ์„œ๋กœ ์œ„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ target์ด ์žˆ๋Š” ์ง€ ํ™•์ธ

โ‰ซ (1) ์žˆ๋‹ค๋ฉด โ‘ ๋ถ€ํ„ฐ ๋‹ค์‹œ ์žฌ๊ท€ → ์žˆ๋Š” ๊ณณ๋งŒ ๊ณ„์† ํŒœ (depth-first search)

โ‰ซ (2) ์—†๋‹ค๋ฉด ์ „์—ญ๋ณ€์ˆ˜ n ๊ทธ๋งŒํผ size๋ฅผ 2๋กœ ๋‚˜๋ˆˆ ๊ฐ’์˜ ์ œ๊ณฑ์„ ๋”ํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ๋ฐฉํ–ฅ ํƒ์ƒ‰ (๋ฐ˜๋“œ์‹œ target์ด 4๋“ฑ๋ถ„ํ•œ ๊ณณ ์ค‘ ํ•œ ๊ตฐ๋ฐ์— ์žˆ์Œ)

โ€ป ์ฃผ์˜์ ! 4๋“ฑ๋ถ„ํ•  ๋•Œ ๋งˆ๋‹ค ์‹œ์ž‘์  (i,j)๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๋ฏ€๋กœ updateํ•œ (i,j)๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜ ์ธ์ž์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค

โ€ป ๋ฐ˜๋“œ์‹œ pseudo-code ํ๋ฆ„์„ ๋จผ์ € ๊ทธ๋ฆฐ ๋‹ค์Œ ์ฝ”๋”ฉ ์ง„ํ–‰ํ•˜๊ธฐ

 

๐Ÿด ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ

import sys
N,r,c=map(int,input().split())
size = 2**N
global n
n = 0
i,j=0,0
flag=False

def draw_Z(i,j,size):
    if size==2:
        global n
        if i<=r<=(i+1) and j<=c<=(j+1):
            if (i,j) == (r,c):
                flag = True
                print(n)
                sys.exit()
            elif (i,j+1) == (r,c):
                flag = True 
                print(n+1)
                sys.exit()
            elif (i+1,j) == (r,c):
                flag = True 
                print(n+2)
                sys.exit()
            else:
                flag = True
                print(n+3)
                sys.exit()
        n += 4
        return
    else:
        draw_Z(i,j,size//2)
        draw_Z(i,j+size//2,size//2)
        draw_Z(i+size//2,j,size//2)
        draw_Z(i+size//2,j+size//2,size//2)

draw_Z(i,j,size)

 

→ ๋„ˆ๋ฌด ๋งŽ์ด ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ„๋‹ค. ์“ธ๋ฐ์—†์ด ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ„๋‹ค.

 

→ ์›ํ•˜๋Š” target์ด ์˜ˆ๋ฅผ ๋“ค์–ด 35๋ผ๋ฉด, ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ๋Š” ๊ธธ์ด๊ฐ€ 2์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์ฐจ๋ก€๋Œ€๋กœ ์ผ์ผ์ด ๋‹ค ์•Œ์•„๋ณด๊ณ  ์ผ๋ช… ๋…ธ๊ฐ€๋‹ค์„ฑ์œผ๋กœ ๊ณ„์† ํƒ์ƒ‰ํ•œ๋‹ค.

→ ํ•˜์ง€๋งŒ ๋งžํžŒ ์ฝ”๋“œ๋Š” target์ด ๋“ค์–ด๊ฐ„ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜• ๋จผ์ € ๋“ค์–ด๊ฐ€๊ณ , target์ด ๋“ค์–ด๊ฐ„ ๊ทธ ๋‹ค์Œ ํฐ ์ •์‚ฌ๊ฐํ˜•๋งŒ ๋“ค์–ด๊ฐ€๋Š” ๋“ฑ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ํšŸ์ˆ˜๊ฐ€ ํ˜„์ €ํžˆ ์ ๋‹ค.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€