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

[C/C++] swea 1209. [S/W 문제해결 기본] 2일차 - Sum

by Go! Jake 2022. 9. 24.

문제풀이

문제는 크게 각 수의 합을 구하고 비교하는 데에 있음.

Sum
Sum 설명

첫 번째, 비교할 때 for문을 사용한다. 각 행의 합을 구하는 것, 각 열의 합을 구하는 것, 대각선의 합을 구하는 것. 이렇게 3가지의 합을 구해야 함.

두 번째, 각각의 최댓값을 비교하여 마지막 최댓값을 비교해야 함.

 

첫 번째의 for문 사용은, 아래와 같이 행에 들어가는 변수와 열에 들어가는 변수를 바꿔서 처리하면 각각 행 기준으로, 그리고 열 기준으로 더할 수 있음. 따라서 아래와 같이 사용해야 함.

	for (int i=0; i<MAX; i++)
	{
		r=0;
		for (int j=0; j<MAX; j++)
		{
			r+=map[i][j];
		}
		if (r>=r_max) r_max=r;
		
		c=0;
		for (int j=0; j<MAX; j++)
		{
			c+=map[j][i];
		}
		if (c>=c_max) c_max=c;
	}

그리고 대각선은 아래처럼 각각 변수에서 [a++][b++] 등으로 행과 열이 하나씩 증가하거나 감소하는 코드를 사용할 수 있음. 다만 처음에 실수한 게 map[a++][a++]; 등으로 코드를 구성하다 보니 행에 있는 a가 1이었다고 하면 열에서 이 값을 받을 때 2로 받게 되는 것임. 그래서 독립적인 변수를 사용하는 게 맞음.

	for (int i=0; i<MAX; i++)
	{
		diag_1+=map[a++][b++];
	}
	
	for (int i=0; i<MAX; i++)
	{
		diag_2+=map[tmp--][c++];
	}
 

소스코드

#include <iostream>
#include <algorithm>
#include <vector>
#define MAX 100
using namespace std;

int tc,n;
int map[MAX][MAX];
int r,c,diag_1,diag_2;
int r_max=-1,c_max=-1,diag_max=-1;
int ans;

void input()
{
	for (int i=0; i<MAX; i++)
	{
		for (int j=0; j<MAX; j++)
		{
			cin>>map[i][j];
		}
	}
}

void count_r_c()
{
	/* row */ /* column */
	c_max=0;
	r_max=0;
	for (int i=0; i<MAX; i++)
	{
		r=0;
		for (int j=0; j<MAX; j++)
		{
			r+=map[i][j];
		}
		if (r>=r_max) r_max=r;
		
		c=0;
		for (int j=0; j<MAX; j++)
		{
			c+=map[j][i];
		}
		if (c>=c_max) c_max=c;
	}
}

void diag_func()
{
	diag_1=0;
	diag_2=0;
	diag_max=0;
	int a=0;
	int b=0;
	int c=0;
	int tmp=MAX-1;
	//inc
	for (int i=0; i<MAX; i++)
	{
		diag_1+=map[a++][b++];
	}
	
	for (int i=0; i<MAX; i++)
	{
		diag_2+=map[tmp--][c++];
	}
	
	if (diag_1>=diag_2) diag_max=diag_1;
	else diag_max=diag_2;
}
				

int main()
{
	//freopen("input.txt","rt",stdin);
	
	for (int i=0; i<10; i++)
	{
		cin>>tc;
		input();
		count_r_c();
		diag_func();
	
		if (r_max>=c_max)
		{
			ans=r_max;
		}
		else
		{
			ans=c_max;
		}
		if (diag_max>=ans) ans=diag_max;
		cout<<"#"<<i+1<<" "<<ans<<endl;
	}
	return 0;
}

댓글