BOJ/๐Ÿฅˆ

โ˜…Divide & Conquer Upper-Intermediate I - 9 Solvedโ˜…

metamong 2023. 3. 20.

โ˜… 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์ด ๋“ค์–ด๊ฐ„ ๊ทธ ๋‹ค์Œ ํฐ ์ •์‚ฌ๊ฐํ˜•๋งŒ ๋“ค์–ด๊ฐ€๋Š” ๋“ฑ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ํšŸ์ˆ˜๊ฐ€ ํ˜„์ €ํžˆ ์ ๋‹ค(๋ถ„ํ•  ์ •๋ณต์„ ์“ฐ๋Š” ์ด์œ )


โ˜… 1629 ๊ณฑ์…ˆ โ˜…

import sys
input=sys.stdin.readline
A,B,C=map(int,input().split())

def get_power(a,b,c):
    if b == 1:
        return a%c
    x = get_power(a,b//2,c)

    if b % 2 == 0:
        return ((x%c) * (x%c)) % c
    else:
        return ((x%c) * (x%c) * a)%c

print(get_power((A%C),B,C))

 

๐Ÿด ์ „ํ˜•์ ์ธ '๋ถ„ํ•  ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ' ์•Œ๊ณ ๋ฆฌ์ฆ˜. ๋ณ„๋„ ํฌ์ŠคํŒ… ์ฐธ์กฐ


โ˜… 11819 The Shortest does not Mean the Simplest โ˜…

def get_power_by_divisor(a,b,c):
    if b == 1:
        return a%c
    else:
        x = get_power_by_divisor(a,b//2,c)
        if b%2 == 0:
            return ((x%c) * (x%c))%c
        else:
            return ((x%c) * (x%c) * (a%c))%c 
        

A,B,C=map(int,input().split())

print(get_power_by_divisor(A,B,C))

 

๐Ÿด 1629์™€ ๋™์ผ


โ˜… 13171 A โ˜…

import sys
input=sys.stdin.readline

def get_power_by_divisor(a,b,c):
    if b == 1:
        return a%c
    else:
        x = get_power_by_divisor(a,b//2,c)
        if b%2 == 0:
            return ((x%c) * (x%c))%c
        else:
            return ((x%c) * (x%c) * (a%c))%c 



A=int(input())
X=int(input())
divisor = 1_000_000_007

print(get_power_by_divisor(A,X,divisor))

 

๐Ÿด ์—ญ์‹œ ๋™์ผ


โ˜… 17829 222-ํ’€๋ง โ˜…

import sys
input=sys.stdin.readline
N=int(input())
arr=[]
for _ in range(N):
    arr.append(list(map(int,input().split())))

def pooling(arr, length):
    if length == 1:
        print(*arr[0])
        sys.exit()
    new_arr = [[10_001]*(length//2) for _ in range(length//2)]
    num = length//2
    for i in range(num):
        start_x,start_y = 0+2*i,-2
        for j in range(num):
            start_y += 2
            a = arr[start_x][start_y]
            b = arr[start_x+1][start_y]
            c = arr[start_x][start_y+1]
            d = arr[start_x+1][start_y+1]
            new_arr[i][j] = sorted([a,b,c,d])[-2]
    pooling(new_arr, num)

pooling(arr,N)

 

๐Ÿด ์ „ํ˜•์ ์ธ ๋ถ„ํ• ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜. ๋ถ„ํ• ์ •๋ณต ์žฌ๊ท€ ์ฝ”๋“œ ์“ธ ๋•Œ, ํ•จ์ˆ˜ ์ž‘์„ฑ ํ›„ (1) ๋จผ์ € ์ข…๋ฃŒ ์กฐ๊ฑด ํ™œ์šฉํ•œ ์ฝ”๋“œ → (2) ๋™์ผ ํ•จ์ˆ˜ ์ด๋ฆ„ ์จ์„œ ์žฌ๊ท€๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ฝ”๋“œ

 

๐Ÿด ๋ถ„ํ• ์ •๋ณต ์žฌ๊ท€ ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ, ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ธ์ž์— ์•Œ๋งž๊ฒŒ ๋“ค์–ด๊ฐ€๊ฒŒ๋” ๊ทœ์น™์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”! ์œ„ ๋ฌธ์ œ๋Š” ์ ์  ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง€๋ฏ€๋กœ, 2๋กœ ๋‚˜๋ˆˆ ๊ธธ์ด์™€ ๋ฌธ์ œ์— ๋งž๋Š” ํ’€๋ง ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ž๋กœ ๋„ฃ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค


โ˜… 1992 ์ฟผ๋“œํŠธ๋ฆฌ โ˜…

import sys
input=sys.stdin.readline

def is_zero_or_one(arr):
    l=len(arr)
    cmp=arr[0][0]

    for i in range(l):
        for j in range(l):
            if cmp != arr[i][j]:
                return False
        
    return str(cmp)


N=int(input())
quad_tree,ans=[],[]
for _ in range(N):
    quad_tree.append(list(map(int,input().rstrip())))

def compress(arr,l,ans):
    if l>=2:
        
        res = is_zero_or_one(arr)
        if res:
            ans.append(int(res))
        else:
            ans.append('(')
            if l!=2:
                a,b,c,d=[],[],[],[]
                for i in arr[:l//2]:
                    a.append(i[:l//2])
                    b.append(i[l//2:])
                
                for j in arr[l//2:]:
                    c.append(j[:l//2])
                    d.append(j[l//2:])
                
                compress(a,l//2,ans)
                compress(b,l//2,ans)
                compress(c,l//2,ans)
                compress(d,l//2,ans)
            else:
                ans.extend([arr[0][0],arr[0][1],arr[1][0],arr[1][1]])
            ans.append(')')
        
if N != 1:
    compress(quad_tree,len(quad_tree),ans)
    print(*ans,sep='')
else:
    print(quad_tree[0][0])

 

๐Ÿด ์ •์‚ฌ๊ฐํ˜•์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ 2์˜ ์ œ๊ณฑ์ˆ˜์ด๋ฏ€๋กœ ์ ˆ๋ฐ˜์”ฉ ๋ถ„ํ• ํ•ด๊ฐ€๋ฉฐ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด ์ˆซ์ž๋ฅผ ๋ถ™์ด๊ฑฐ๋‚˜ ๋ชจ๋‘ ๊ฐ™์ง€ ์•Š์œผ๋ฉด (๋ฅผ ๋ถ™์ด๊ณ  ๋” ๋ถ„ํ• ํ•ด๊ฐ€๋ฉฐ ์ •๋ณตํ•˜๋ฉด์„œ ๋„์ค‘์— ์—…๋ฐ์ดํŠธ ๋˜๋Š” ans list ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (์ •๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์ž˜ ๋ถ„์„ํ•˜๋ฉด ๋œ๋‹ค)


โ˜… 21854 Monsters โ˜…

import sys
input = sys.stdin.readline
MOD = 10**9+7

def get_power(a,b,c):
    if b == 1:
        return a%c
        
    x = get_power(a,b//2,c)

    if b % 2 == 0:
        return ((x%c) * (x%c)) % c
    else:
        return ((x%c) * (x%c) * (a%c))%c

n=int(input())
ks=list(map(int,input().split()))

ans=0
for k in ks:
    if k == 0:
        ans += 1
    else:
        ans+=get_power(2,k,MOD)
print(ans%MOD)

 

๐Ÿด 2^k์„ ๋ถ„ํ• ์ •๋ณต๊ฑฐ๋“ญ์ œ๊ณฑ์œผ๋กœ ๊ตฌํ•ด์„œ ๋ˆ„์ ์œผ๋กœ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๋•Œ 2^k์„ MOD๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋ฏ€๋กœ, ์žฌ๊ท€๋กœ ๊ตฌํ•˜๋Š” ๋„์ค‘ ๊ณฑ์…ˆ์˜ ์„ฑ์งˆ์— ๋”ฐ๋ผ ๋„์ค‘๋„์ค‘ %MOD ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ด ๊ตฌํ•œ๋‹ค.


 

 

 

 

 

 

๋Œ“๊ธ€