본문 바로가기
C C++/C C++ 알고리즘 문제 기타

[C/C++] swea 2805. 농작물 수확하기

by Go! Jake 2022. 9. 21.

문제풀이

문제는 크게 두 가지를 잘 생각해 보면 좋음. 기본적으로 for문으로 해야된다는 건 알고 있을 것임.

그러면 어떻게 농작물 모양으로 수확을 해 나가냐가 문제임.

 

아래 스탬프 1,2,3을 차례로 살펴보자.

1) 1번의 경우 정가운데 열에서 시작함. 이는 nxn 맵에서 n/2를 사용하면 정중앙이 나옴. (e.g. 5/2 = 2번 인덱스)

2) 2번의 경우 개수가 1개에서 3개로 늘어남. 이 때는 for문의 조건을 변경해야 된다는 생각을 해야함.

예를 들어 for (int j=0; j<2*i+1; j++) 등등이다. 1,3,5,7....로 늘어나야하고, 이 늘어나는 횟수만큼이 for문에 반영되어 for문이 돌아야한다.

3) 이런식으로 쭉 돌고, 중앙점 이후로 또 개수가 줄어듦.

이건 또 다르게 표현해야함.

예를 들어 for (int j=0; j<n-2*(i-n/2); j++)로 표현할 수 있음.

이 의미는 전체 n개에서 2개씩 줄어드는 그림으로 이해하면 됨.

식이 이상해보이지만, n개 모두 차 있는 다음 줄부터 세는 것이기 때문에 바로 -2씩 먹으면 되고, 이는 i-n/2로 표현하면 1이 되어, n-2개가 되는 것임. 그림 보면서 잘 따져보면 값이 나옴.

농작물수확
농작물수확 문제

소스코드

#include <iostream>
#include <algorithm>
#include <vector>
#define MAX 50
using namespace std;

int t,n;
int map[MAX][MAX];
int sum;

void input()
{
	for (int i=0; i<n; i++)
	{
		for (int j=0; j<n; j++)
		{
			scanf("%1d",&map[i][j]);
		}
	}
}

void harvest()
{
	sum=0;	
	for (int i=0; i<n; i++)
	{
		if (i<=n/2)
		{
			for (int j=0; j<2*i+1; j++)
			{
				sum+=map[i][n/2-i+j];
			}
		}
		else
		{
			for (int j=0; j<n-2*(i-n/2); j++)
			{
				sum+=map[i][n/2+j-(n-(i+1))];
			}
		}
	}		
}

int main()
{
	//freopen("input.txt","rt",stdin);
	
	cin>>t;
	for (int i=0; i<t; i++)
	{
		cin>>n;
		input();
		harvest();
		cout<<"#"<<i+1<<" "<<sum<<endl;
	}
	
//	for (int i=0; i<n; i++)
//	{
//		for (int j=0; j<n; j++)
//		{
//			cout<<map[i][j];
//		}
//		cout<<endl;
//	}
	
	return 0;
}

 

댓글