안녕 세상아,

[SWEA/c++] 2805. 농작물 수확하기 본문

SWEA

[SWEA/c++] 2805. 농작물 수확하기

돈 많은 백수가 되고싶다 2024. 11. 9. 17:19

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV7GLXqKAWYDFAXB&categoryId=AV7GLXqKAWYDFAXB&categoryType=CODE&problemTitle=&orderBy=INQUERY_COUNT&selectCodeLang=CCPP&select-1=3&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

뭐 이런 이상한 규칙이 다 있담..

규칙 생각하는데 한참 걸렸다. 더 간단한 방법도 있겠지만 나는 mid값 기준으로 위 아래로 나눠서 풀었다.

 

2차원 벡터로 풀었고, 띄어쓰기 없는 숫자의 연속이기 때문에 string으로 값을 받아준 후 하나씩 정수로 분리한 후 벡터에 넣어줬다. 

n이 1일 때 고려를 안해줬기 때문에 틀려서 조건문으로 n이 1일 때, 1이 아닐 때 구분해서 풀었다. 

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

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;
		cin >> n;
		
        //2차원 벡터 선언
		vector < vector<int>> v(n, vector<int>(n));

		for (int i = 0; i < n; i++) {
			string str;
			cin >> str;
			for (int j = 0; j < n; j++) {
				v[i][j] = str[j] - '0';
			}
		}
		int mid = n / 2;

		int sum = 0;

		if (n != 1) {
			sum += v[0][mid];

			//mid 기준으로 위아래 나눠서 생각하기
			for (int i = 1; i < mid; i++) {
				for (int j = 1; j <= i; j++) {
					sum += v[i][mid - j];
					sum += v[i][mid + j];
				}
				sum += v[i][mid];
			}
			for (int i = mid; i < n; i++) {
				int cnt = mid - i + mid;	
				for (int j = 1; j <= cnt; j++) {
					sum += v[i][mid - j];
					sum += v[i][mid + j];
				}
				sum += v[i][mid];
			}
			cout <<"#"<<test_case<<" "<< sum << endl;
		}
		else
		{
			cout << "#" << test_case << " " << v[0][0] << endl;
		}
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

 

다른 풀이랑 비교해보니까 너무 장황하게 푼듯...문제 푸는 스킬이 그냥 없는듯 ㅜ