본문 바로가기
C++ 알고리즘

2805. 농작물 수확하기 D3

by hoshi03 2024. 10. 27.

N X N크기의 농장이 있다.

이 농장에는 이상한 규칙이 있다.

규칙은 다음과 같다.


   ① 농장은 크기는 항상 홀수이다. (1 X 1, 3 X 3 … 49 X 49)

   ② 수확은 항상 농장의 크기에 딱 맞는 정사각형 마름모 형태로만 가능하다.



                                         
1 X 1크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 3이다.

3 X 3크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 16 (3 + 2 + 5 + 4 + 2)이다.

5 X 5크기의 농장에서 자라는 농작물의 수확하여 얻을 수 있는 수익은 25 (3 + 2 + 1 + 1 + 2 + 5 + 1 + 1 + 3 + 3 + 2 + 1)이다.

농장의 크기 N와 농작물의 가치가 주어질 때, 규칙에 따라 얻을 수 있는 수익은 얼마인지 구하여라.


[제약 사항]

농장의 크기 N은 1 이상 49 이하의 홀수이다. (1 ≤ N ≤ 49)

농작물의 가치는 0~5이다.


[입력]

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

각 테스트 케이스에는 농장의 크기 N과 농장 내 농작물의 가치가 주어진다.


[출력]

각 줄은 '#t'로 시작하고, 공백으로 농장의 규칙에 따라 얻을 수 있는 수익을 출력한다.

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

입력1
5
14054
44250
02032
51204
52212
 
 
출력#1 23

 

• 풀이

 

별찍기로 마름모 모양을 출력하는 것과 유사한 문제

 

위, 아래 삼각형을 나눠서 하는 방식으로 별찍기와 거의 유사한 알고리즘을 사용했으니, 값이 제대로 나오지 않았고

홀수만 가능한 경우였기에 아래와 같은 반복문으로 마름모 부분의 숫자만 누적했다, 짝수는 아래와 같은 경우로 사용 불가능하다, 아마 i = 0 || i = n-1 일때 j가 n/2 -1 이면 별 찍는 형태로 맨 앞, 맨 뒤 하나 찍는 로직을 추가해줘야 될 것 같다

		int mid = n / 2;
		for (int i = 0; i < n; i++) {
			int start = abs(mid - i);
			int end = n - start;
			for (int j = start; j < end; j++) {
				res += arr[i][j];
			}
		}

 

n =5인 경우

start는 2, 1, 0, 1, 2가 된다

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

int main() {

	int tc;
	cin >> tc;


	for (int t = 1; t <= tc; t++) {
		int n, res = 0;
		cin >> n;
		vector<vector<int>> arr(n, vector<int>(n, 0));
		for (int i = 0; i < n; i++) {
			string s;
			cin >> s;
			for (int j = 0; j < n; j++) {
				arr[i][j] = s[j] - '0';
			}
		}

		int mid = n / 2;
		for (int i = 0; i < n; i++) {
			int start = abs(mid - i);
			int end = n - start;
			for (int j = start; j < end; j++) {
				res += arr[i][j];
			}
		}


		cout << "#" << t << " " << res << '\n';
	}

	return 0;
}