본문 바로가기

알고리즘 문제

[C/C++ 백준 1074번] Z (Silver 1)

https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원 ��

www.acmicpc.net

알고리즘은 굉장히 간단하지만, 생각없이 구현해서 그런지 약간 까다로웠다. 꼭 노트로 먼저 끄적여보고 해보는게 좋을 것 같다.

주어진 좌표를 이용해 몇 사분면(?)인지 구해주고, 다시 해당 사분면으로 들어가 같은 행동을 반복하면 된다. 재귀함수를 이용하면 편하다.

 

#include <cstdio>
int cnt=0;
void Func(int N, int r, int c){
	if(N==0){
		return ;
	}
	else{
	int i=N, width=1;	
	while(i-->0){
		width *= 2;
	}
	if(r>width/2){
		cnt += width * (width/2);
		r -= width/2;
	}
		
	if(c>width/2){
		cnt += (width/2) * (width/2);
		c -= width/2;
	}
	Func(N-1, r, c);
}	
}
int main(void){
	int N, r, c;
	scanf("%d %d %d",&N,&r,&c);
	Func(N, r+1, c+1);
	printf("%d", cnt);
}