2년 전에는 몇 시간동안 쩔쩔 맸던 문제인데, 딱 보자마자 풀 수 있어서 매우 기분이 좋네요 ㅎㅎ
1074번: Z
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서
www.acmicpc.net
코드 자체는 이쁘지 않지만, 직관적으로 구성하였습니다.
#include <bits/stdc++.h> using namespace std; int rec(int n, int r, int c){ if(n == 1){ return 2 * r + c; } int half = 1; for(int i = 0 ; i < n - 1 ; i++) half *= 2; int nextr, nextc, pos; if(r >= half && c >= half){ pos = 3; r -= half; c -= half; } else if(r >= half && c < half){ pos = 2; r -= half; } else if(r < half && c >= half){ pos = 1; c -= half; } else pos = 0; return half * half * pos + rec(n - 1, r, c); } int main(){ ios_base :: sync_with_stdio(false); cin.tie(NULL); int n,r,c; cin >> n>>r>>c; cout << rec(n,r,c); }
Top Down 방식으로 구현하였습니다.
현재 좌표를 통해 몇 사분면에 위치해있는지를 판단하고
해당 사분면에 대해서 다시 좌표를 계산해서 재귀적으로 구성합니다.
n이 1인 상태가 기준 상태이고, 그때는 값을 리턴하게 됩니다.
댓글