본문 바로가기
백준

[백준] 1074번 파이썬 (Z)

by 헤이즐넛 좋아하는 개발자 2024. 3. 4.

첫 번째 방법은 규칙성으로 풀었다.

import sys
input = sys.stdin.readline

N, r, c = map(int, input().split())
cnt = 0

while N > 1:
    size = (2 ** N) // 2
    if r < size and c < size:
        pass
    elif r < size and c >= size:
        cnt += size ** 2
        c -= size
    elif r >= size and c < size:
        cnt += size ** 2 * 2
        r -= size
    elif r >= size and c >= size:
        cnt += size ** 2 * 3
        r -= size
        c -= size
    N -= 1

if r == 0 and c == 0:
    print(cnt)
if r == 0 and c == 1:
    print(cnt + 1)
if r == 1 and c == 0:
    print(cnt + 2)
if r == 1 and c == 1:
    print(cnt + 3)

두 번째 방법은 재귀함수로도 풀 수 있겠다고 생각했다.

https://ggasoon2.tistory.com/11

 

백준 1074번 - Z ( python )

백준 1074번 Z 입니다. 문제를 보자면, ( 이미지 클릭하면 크게 볼 수 있음 ) 배열의 크기는 가로 (2 ** N ) * 세로 (2 ** N) 이며, 그 배열안에는 위와 같은 z 모양의 규칙을 가지며 숫자가 들어갑니다.

ggasoon2.tistory.com

위 게시글을 참고해서 작성했다.

import sys
input = sys.stdin.readline

N, r, c = map(int, input().split())

def sol(N, r, c):
    if N == 0:
        return 0
    
    return 2*(r%2)+(c%2) + 4 * sol(N-1, int(r/2), int(c/2))

print(sol(N, r, c))