- 문제 설명
크기가 N*N인 배열의 부분배열인 n*m 배열의 합충 가장 큰 값 출력
10<=N<=100, 1<=n,m<N
예시 5,2,3
ㅇㅇㅇㅁㅁ
ㅇㅇㅇㅁㅁ
ㅁㅁㅁㅁㅁ
ㅁㅁㅁㅁㅁ
ㅁㅁㅁㅁㅁ
동그라미로 표시된(2*3네모) 안에 있는 값들의 합을 비교
동그라미로 표시된 곳은 아래와 같이 이동 가능
ㅁㅁㅁㅁㅁ
ㅁㅁㅇㅇㅇ
ㅁㅁㅇㅇㅇ
ㅁㅁㅁㅁㅁ
ㅁㅁㅁㅁㅁ
결국 부분 배열로 가질 수 있는 합들을 다 비교해야함
- 입력
1 // 테스트 케이스
5 3 3 // N, n, m
0 1 1 0 1
1 1 0 1 1
0 1 1 0 0
0 0 1 0 0
1 0 1 0 0
- 출력
#1 6
- 입력 예시
2
5 3 3
0 1 1 0 1
1 1 0 1 1
0 1 1 0 0
0 0 1 0 0
1 0 1 0 0
10 8 6
0 1 1 1 1 0 0 0 1 1
1 1 1 1 1 0 1 0 1 1
1 1 0 1 0 1 0 1 1 0
1 0 0 1 1 1 0 1 0 1
0 1 1 0 0 1 0 0 0 0
1 1 1 0 1 1 0 1 0 1
0 0 1 1 1 1 1 0 0 0
1 1 0 0 1 0 1 0 1 1
1 1 0 0 1 0 1 0 1 1
1 1 0 1 0 0 1 1 0 0
- 출력 예시
#1 6
#2 32
- 코드
int arr[100][100];
int main(int argc, const char * argv[]) {
int T;
scanf("%d", &T);
for(int tc = 1;tc <= T;tc++)
{
int N, row, col;
scanf("%d %d %d",&N,&row,&col);
for(int i=0; i< N; i++)
{
for(int j=0;j<N;j++)
{
scanf("%d",&arr[i][j]); // 입력받은 배열 채우기
}
}
int maxSum = 0;
for(int k=0;k<N-row+1;k++) // 행의 부분 배열
{
for(int r=0;r<N-col+1;r++) // 열의 부분 배열
{
int sum = 0;
for(int i=k;i<row+k;i++)
{
for(int j=r;j<col+r;j++)
{
sum+=arr[i][j]; // 부분 배열 안의 합
}
}
if(sum > maxSum) maxSum = sum; // 최대값 저장
}
}
printf("#%d %d\n",tc,maxSum);
}
return 0;
}
'교육 > 문제해결' 카테고리의 다른 글
[2일차][재귀함수] 전기버스 (0) | 2017.08.29 |
---|---|
[1일차] 충전버스 (0) | 2017.08.28 |
[1일차] 사선으로 채우기 (0) | 2017.08.28 |
[1일차] 나선형 배열 (0) | 2017.08.28 |
[1일차] 가장 많은 숫자카드 찾기 (0) | 2017.08.28 |