알고리즘 스터디
[백준] 1074번 : Z - Python(파이썬)
히치키치
2022. 6. 13. 23:39
문제
https://www.acmicpc.net/problem/1074
1074번: Z
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을
www.acmicpc.net
아이디어
1. 사분면 나누는 기준점 설정
한 변 2^N을 절반인 2로 나누기
2^N / 2 = 2^(N-1)
2. 본인 좌표 도달한 경우
더 이상 이전에 방문한 사분면이 없기 때문에 0을 반환하며 총 방문값에 더해 끝냄
3. 한 사분면에 대한 개수 * 지나온 사분면 갯수
(한 변) * (한 변) = 한 사분면 갯수
좌표가 해당하는 사분면 - 1 = 지나 온 사분면 갯수
전체코드
#https://www.acmicpc.net/problem/1074
import sys
input=sys.stdin.readline
n, r, c = map(int, input().split())
# return : 0, 1, 2, 3 (몇 사분면에 해당하는지 반환)
def quad(n, r, c):
num = 2**(n-1)
# 해당 함수는 몇사분면 위인지 확인?
if (r < num) & (c < num): # 1사분면
return 0
elif (r < num) & (c >= num): # 2사분면
return 1
elif (r >= num) & (c < num): # 3사분면
return 2
else: # 4사분면
return 3
def visit(n,r,c):
if n==1:
return quad(n,r,c)
q=quad(n,r,c)
size=2**(n-1)
visited=size*size*q
if q==0:
return visited+visit(n-1,r,c)
elif q==1:
return visited + visit(n-1,r,c-size)
elif q==2:
return visited + visit(n-1, r-size,c)
else:
return visited + visit(n-1, r-size,c-size)
print(visit(n, r, c))