백준1074(파이썬) - Z

resilient

·

2021. 5. 27. 00:37

728x90
반응형

https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서

www.acmicpc.net

  • 이 문제는 구현을 어떻게 하느냐가 중요하다.
  • 나는 사분면으로 생각하였다.
  • 사분면의 한 길이를 구해주고, 그 길이랑 r과 c를 비교해서 몇 사분면에 있는지를 먼저구한뒤, 속해 있는 사분면 전까지의 합을 먼저 num 값에 넣어준다.
  • 그 이후에 속해 있는 사분면을 또 사분면으로 쪼개서 생각해봐야한다. 그렇게 되면 r과 c는 결국 쪼개다보면 (0,0) (1,0),(0,1),(1,1) 로 값이 한정되게 된다. 즉, 한변이 2짜리인 정사각형으로 마지막에 쪼개지게 된다. 
import sys
input = sys.stdin.readline

n, r, c = map(int, input().split())
#r,c를 주어진 큰 정사각형중에서 x,y좌표로 생각한다.
num = 0
while n > 0:
    # 사분면 한 변의 길이
    square = (2 ** n) // 2
    if n > 1:
        if square > r and square <= c:
            num += square ** 2
            c -= square
        elif square <= r and square > c:
            num += (square ** 2) * 2
            r -= square
        elif square <= r and square <= c:
            num += (square ** 2) * 3
            r -= square
            c -= square
    #3개로 쪼갠이유는 0,0일때는 이미 square에서 처리한값을 num에 더해주었기때문이다.
    elif n == 1:
        if r == 0 and c == 1:
            num += 1
        elif r == 1 and c == 0:
            num += 2
        elif r == 1 and c == 1:
            num += 3
    n -= 1
print(num)

반응형