문제풀이
문제는 크게 두 가지를 잘 생각해 보면 좋음. 기본적으로 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;
}
'C C++ > C C++ 알고리즘 문제 기타' 카테고리의 다른 글
[C/C++] swea 1220. [S/W 문제해결 기본] 5일차 - Magnetic (1) | 2022.09.25 |
---|---|
[C/C++] swea 1209. [S/W 문제해결 기본] 2일차 - Sum (1) | 2022.09.24 |
[C/C++] 백준 1547번 공 (0) | 2022.09.17 |
[C/C++] 백준 7568번 덩치 (0) | 2022.09.17 |
[C/C++] 백준 10872번 팩토리얼 (0) | 2022.09.17 |
댓글