c언어/BAEKJOON

c언어 24460번 특별상이라도 받고 싶어 (백준)

rofn123 2025. 3. 14. 04:35
int a[1024][1024];
int loop(int n, int i, int j) {
	if(n==1) {
		return a[i][j];
	} else {
		n>>=1;
		int x,y,z,t;
		x=loop(n,i,j);
		y=loop(n,i+n,j);
		z=loop(n,i,j+n);
		if(x>y) {t=x;x=y;y=t;}
		if(x>z) {y=x;x=z;}
		else if(y>z) y=z;
		z=loop(n,i+n,j+n);
		if(x>z) {y=x;x=z;}
		else if(y>z) y=z;
		return y;
	}
}
int main() {
	int n,i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]);
	printf("%d",loop(n,0,0));
}

 

풀이 : 재귀, 분할정복

 

loop을 이용합니다.

n >=2 즉 2*2 matrix 까지는 네 곳에 있던 값 중 두번째로 작은 값을 구해서 반환합니다.

n == 1 인 경우 입력받은 데이터를 반환합니다. 이는 비교를 위해 가져오는 것 입니다.

 

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