본문 바로가기
백준/실버

[1] 백준 1074 Z

by Riverandeye 2020. 12. 27.

2년 전에는 몇 시간동안 쩔쩔 맸던 문제인데, 딱 보자마자 풀 수 있어서 매우 기분이 좋네요 ㅎㅎ

 

www.acmicpc.net/problem/1074

 

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인 상태가 기준 상태이고, 그때는 값을 리턴하게 됩니다. 

댓글