-
[SWEA] 2001. 파리 퇴치 c++Coding Test/SW Expert Academy 2022. 11. 15. 12:23728x90
- 문제
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'Coding Test > SW Expert Academy' 카테고리의 다른 글
[SWEA] 1984. 중간 평균값 구하기 c++ (0) 2022.11.15 [SWEA] 1989. 초심자의 회문 검사 c++ (0) 2022.11.15 [SWEA] 2005. 파스칼의 삼각형 c++ (0) 2022.11.15 [SWEA] 2007. 패턴 마디의 길이 c++ (0) 2022.11.15 [SWEA] 1859. 백만 장자 프로젝트 c++ (0) 2022.11.14