it 취업을 위한 알고리즘 문제풀이 입문 : 50. 영지 선택 (small)
🙇♀️영지 선택 (small)
세종대왕은 현수에게 현수가 다스릴 수 있는 영지를 하사하기로 했다.
전체 땅은 사각형으로 표시된다.
그 사각형의 땅 중에서 세종대왕이 현수가 다스릴 수 있는 땅의 크기(세로의 길이와 가로의 길이)를 정해주면 전체 땅 중에서 그 크기의 땅의 위치를 현수가 정하면 되는 것이다.
전체 땅은 사각형의 모양의 격자로 되어 있으며, 그 사각형 땅 안에는 많은 오렌지 나무가 심겨져 있다.
현수는 오렌지를 무척 좋아하여 오렌지 나무가 가장 많이 포함되는 지역을 선택하고 싶어 한다.
현수가 얻을 수 있는 영지의 오렌지 나무 최대 개수를 출력하는 프로그램을 작성하세요.
다음과 같은 땅의 정보가 주어지고, 현수가 하사받을 크기가, 가로 2, 세로 3의 크기이면 가장 많은 오렌지 나무가 있는 영지는 총 오렌지 나무의 개수가 16인 3행 4열부터 시작하는 구역이다.
▣ 입력설명
첫 줄에 H(세로길이)와 W(가로길이)가 입력된다.
(5<=H, W<=50) 그 다음 H줄에 걸쳐 각 사각형 지역에 오렌지의 나무 개수(1~9개) 정보가 주어진다.
그 다음 영지의 크기인 세로길이(1~H)와 가로길이(1~W)가 차례로 입력된다.
▣ 출력설명
첫 줄에 현수가 얻을 수 있는 오렌지 나무의 최대 개수를 출력한다.
▣ 입력예제 1
6 7
3 5 1 3 1 3 2
1 2 1 3 1 1 2
1 3 1 5 1 3 4
5 1 1 3 1 3 2
3 1 1 3 1 1 2
1 3 1 3 1 2 2
2 3
▣ 출력예제 1
16
🚀풀이
한 점의 정보가 주어질 때, 그 점을 기준으로 보상의 값이 얼마인지 구하는 함수를 만들어서 최대값을 구했다.
불필요하게 중복된 부분이 많지만 small 이므로 무식하게 돌아서 풀었다.
int h, w, areaH, areaW, res = 0, award = 0;
vector<vector<int>> board;
void setting()
{
cin >> h >> w;
board = vector<vector<int>>(h, vector<int>(w));
for (int y = 0; y < h; ++y)
{
for (int x = 0; x < w; ++x)
{
cin >> board[y][x];
}
}
cin >> areaH >> areaW;
}
// 한 점의 정보가 주어질 때, 보상이 얼마인지 알려주는 함수
int Award(int u, int v)
{
int res = 0;
for (int y = u; y < areaH + u; ++y)
{
for (int x = v; x < areaW + v; ++x)
{
res += board[y][x];
}
}
return res;
}
void solve()
{
int res = 0;
int award = 0;
for (int y = 0; y <= h - areaH; ++y)
{
for (int x = 0; x <= w - areaW; ++x)
{
// 최대값이 생길때마다 갱신한다.
award = max(award, Award(y, x));
}
}
cout << award;
}
🚀전체 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int h, w, areaH, areaW, res = 0, award = 0;
vector<vector<int>> board;
void setting()
{
cin >> h >> w;
board = vector<vector<int>>(h, vector<int>(w));
for (int y = 0; y < h; ++y)
{
for (int x = 0; x < w; ++x)
{
cin >> board[y][x];
}
}
cin >> areaH >> areaW;
}
int Award(int u, int v)
{
int res = 0;
for (int y = u; y < areaH + u; ++y)
{
for (int x = v; x < areaW + v; ++x)
{
res += board[y][x];
}
}
return res;
}
void solve()
{
int res = 0;
int award = 0;
for (int y = 0; y <= h - areaH; ++y)
{
for (int x = 0; x <= w - areaW; ++x)
{
award = max(award, Award(y, x));
}
}
cout << award;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}