Coding Test/SW Expert Academy

[SWEA] 2001. 파리 퇴치 c++

owls 2022. 11. 15. 12:23
728x90
  • 문제

N x N 배열 안의 숫자는 해당 영역에 존재하는 파리의 개수를 의미한다.

M x M 크기의 파리채를 한 번 내리쳐 최대한 많은 파리를 죽이고자 한다.

파리를 잡을 수 있는 최댓값을 구하는 문제이다.

 

[제약 사항]

1. N 은 5 이상 15 이하이다.

2. M은 2 이상 N 이하이다.

3. 각 영역의 파리 갯수는 30 이하 이다.


[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 번째 줄에 N 과 M 이 주어지고,

다음 N 줄에 걸쳐 N x N 배열이 주어진다.


[출력]

출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

 

input output
2
5 2
1 3 3 6 7
8 13 9 12 8
4 16 11 12 6
2 4 1 23 2
9 13 4 7 3
6 3
29 21 26 9 5 8
21 19 8 0 21 19
9 24 2 11 4 24
19 29 1 0 21 19
10 29 6 18 4 3
29 11 15 3 3 29
#1 49
#2 159
  • 문제 해결

나는 std::accumulate 함수를 사용하여 문제를 풀었다.

accumulate 함수는 vector 원소들의 합을 구하는 함수이다.

1. nxn 행, 열의 검사 index 범위는 ( 0~ n-m ) 번 이다.

2. mxm 값을 구하는 식을 세운다.

    1) 열 : i번 부터 i+m번의 합을 구한다. 

    2) 행 : j번 부터 j+m번 까지의 열들의 합을 구한다.

3. 최댓값 검사를 한다.

#include<iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

int main(int argc, char** argv)
{
	int test_case;
	int T;
	cin>>T;
	
	for(test_case = 1; test_case <= T; ++test_case)
	{
		int n = 0, m = 0;
        cin >> n >> m;
        
        vector<vector<int>> board(n, vector<int> (n, 0));
        for(int i = 0; i < n; i++){
			for(int j = 0; j < n; j++){
            	cin >> board[i][j];
            }
        }
        
        int nMax = INT8_MIN;
        for(int i = 0; i <= n - m; i++){
            for(int j = 0; j <= n - m; j++){
                int sum  = 0;
                for(int k = 0; k < m; k++){
                  	sum += accumulate(board[j+k].begin() + i, board[j+k].begin() +i+ m , 0);
                }
                nMax = max(nMax , sum);
            }      
        }
        cout << "#" << test_case << " ";
        cout << nMax << endl;
	}
	return 0;
}
728x90