Search
Duplicate

[Python] BOJ 1074

태그
재귀
1 more property

문제

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.
만약, N > 1이 라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.
다음 예는 22 × 22 크기의 배열을 방문한 순서이다.
N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.

풀이

기본 알고리즘
#Loop 1. 2차원 배열(Area)에서 시작 2. r, c 좌표가 현재 Area에서 몇사분면에 속하는지 파악 3. A 사분면에 속할 때 사분면 크기 * (A-1) 만큼의 값을 더해줌 # ex) 3사분면인 경우 1,2사분면을 지나온 것이 확실하기 때문에 해당 값을 누적 4. Area를 해당 A사분면으로 바꿔줌
Python
복사
입력
N, r, c = input().split() N = int(N)
Python
복사
Square 함수 (사분면 판단) - size = Area의 한 변의 길이 - x, y = Area의 시작 x, y 좌표 - r, c = target x,y 좌표
def square(size, x, y, r, c): if (r < x + size/2): if (c < y + size/2): return 1 else: return 2 else: if (c < y + size/2): return 3 else: return 4
Python
복사
Main 동작
Area가 최소가 될때까지 사분면을 찾아 누적값을 더하고, Area의 시작 좌표와 Size를 조정한다.
startx, starty, result = 0,0,0 #시작 Area의 초기화 while N > 0: size = 2 ** int(N) # Area의 한 변의 길이 pos = square(size, startx, starty, int(r),int(c)) # 사분면 찾기 sumsize = int((size/2) ** 2) if pos == 2: starty += size/2 result += sumsize elif pos ==3: startx += size/2 result += sumsize * 2 elif pos == 4: startx += size/2 starty += size/2 result += sumsize * 3 N -= 1 print(result)
Python
복사