백준 1074번: Z



[www.acmicpc.net/problem/1074]

#풀이

- 분할 정복 문제이다. 분할 정복 문제는 보통 세 가지의 구성 요소가 있다.
  • 작은 문제로 분할하는 과정(divid)
  • 각 문제에 대해 구한 답을 원래 문제에 대한 답으로 병합하는 과정(merge)
  • 더이상 답을 분할하지 않고 풀 수 있는 작은 문제(base case)

1. 중앙을 기준으로 4사분면으로 나누어 해당 위치가 몇 사분면에 있는지 판단한다.(divid)
2. 해당 사분면 이전의 사분면들의 크기를 더해준다.(merge)
3. 더 이상 사분면으로 나누어 지지않으면 결과를 출력한다.(base case)

- 처음에 모든 경우를 배열에 담을려 했더니 메모리가 초과되었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sys
sys.setrecursionlimit(10**6)
input = lambda : sys.stdin.readline().rstrip()
 
n,x,y=map(int,input().split())
n=2**n
count=0
 
#divid(x시작값,x끝값,y시작값,y끝값)
def divid(s_x,e_x,s_y,e_y):
    global count
    size=(e_x-s_x)//2
    if size==0:
        print(count)
    #어느 사분면에 있는지 판정 해당 사분면에 없으면 사분면의 크기를 더해준다
    else:
        if s_x<=x<s_x+size and s_y<=y<s_y+size:
            divid(s_x,s_x+size,s_y,s_y+size)
        else:
            count+=size**2
        if s_x<=x<s_x+size and s_y+size<= y < e_y:
            divid(s_x,s_x+size,s_y+size,e_y)
        else:
            count+=size**2
        if s_x+size<=x<e_x and s_y<=y<s_y+size:
            divid(s_x+size,e_x,s_y,s_y+size)
        else:
            count+=size**2
        if s_x+size<=x<e_x and s_y+size<=y<e_y:
            divid(s_x+size,e_x,s_y+size,e_y)
 
divid(0,n,0,n)
cs


댓글 쓰기

Post a Comment (0)

다음 이전