[ BOJ / Python ] 1074번 Z

황승환·2022년 2월 21일
0

Python

목록 보기
194/498


이번 문제는 분할정복을 통해 해결하였다. 규칙을 찾는데에 시간을 많이 썼지만 실패하였고 다른 사람들의 풀이를 조금 참고하였다.

우선 이 문제에서 중요한 것은 사분면으로 계속해서 나누는 것이다. 사분면으로 나눈 후에 구하고자 하는 좌표가 속하는 사분면으로 재귀 호출을 하고, 그 사분면 안에서 다시 좌표가 속하는 사분면으로 재귀 호출을 하게 된다. 이 과정을 사분면으로 나눌 수 없을 때까지 반복하게 되면 정답을 구할 수 있게 된다.

1사분면에 해당할 경우에는 바로 재귀호출을 하면 되지만, 2사분면은 x좌표를 2**size만큼 빼준 후에 재귀호출을 해야 한다. 3사분면은 y좌표를 2**size만큼 빼준 후에 재귀호출을 해야 하고, 4사분면은 x, y좌표를 모두 2**size만큼 빼준 후에 재귀호출을 해야 한다. 이 과정을 적용해주어야 재귀 과정에서 다음 사분면을 쫓아갈 수 있게 된다.

  • N, r, c를 입력받는다.
  • 정답을 저장할 변수 answer를 0으로 선언한다.
  • recursion함수를 size, y, x를 인자로 갖도록 선언한다.
    -> answer를 global로 선언한다.
    -> 만약 size가 0일 경우, 함수를 종료한다.
    -> size를 1 감소시킨다.
    -> 만약 y가 2**size보다 작고, x가 2**size보다 작을 경우, (제 1 사분면)
    --> answer에 (2**size)*(2**size)*0을 더한다.
    --> recursion(size, y, x)를 재귀호출한다.
    -> 만약 y가 2**size보다 작고, x가 2**size보다 크거나 같을 경우, (제 2 사분면)
    --> answer에 (2**size)*(2**size)*1을 더한다.
    --> x를 (2**size)만큼 감소시킨다.
    --> recursion(size, y, x)를 재귀호출한다.
    -> 만약 y가 2**size보다 크거나 같고, x가 2**size보다 작을 경우, (제 3 사분면)
    --> y를 2**size만큼 감소시킨다.
    --> recursion(size, y, x)를 재귀호출한다.
    -> 만약 y가 2**size보다 크거나 같고, x가 2**size보다 크거나 같을 경우, (제 4 사분면)
    --> x를 2**size만큼 감소시킨다.
    --> y를 2**size만큼 감소시킨다.
    --> recursion(size, y, x)를 재귀호출한다.
  • recursion(N, r, c)를 호출한다.
  • answer를 출력한다.

Code

N, r, c=map(int, input().split())
answer=0
def recursion(size, y, x):
    global answer
    if size==0:
        return
    size-=1
    if y<2**size and x<2**size:
        answer+=(2**size)*(2**size)*0
        recursion(size, y, x)
    elif y<2**size and x>=2**size:
        answer+=(2**size)*(2**size)*1
        x-=(2**size)
        recursion(size, y, x)
    elif y>=2**size and x<2**size:
        answer+=(2**size)*(2**size)*2
        y-=(2**size)
        recursion(size, y, x)
    else:
        answer+=(2**size)*(2**size)*3
        y-=(2**size)
        x-=(2**size)
        recursion(size, y, x)
recursion(N, r, c)
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글