Algorithm/C

[백준] 2953번 : 나는 요리사다 C/C++ 문제풀이 솔루션

Printemp 2021. 11. 26.

문제

"나는 요리사다"는 다섯 참가자들이 서로의 요리 실력을 뽐내는 티비 프로이다. 각 참가자는 자신있는 음식을 하나씩 만들어오고, 서로 다른 사람의 음식을 점수로 평가해준다. 점수는 1점부터 5점까지 있다.

각 참가자가 얻은 점수는 다른 사람이 평가해 준 점수의 합이다. 이 쇼의 우승자는 가장 많은 점수를 얻은 사람이 된다.

각 참가자가 얻은 평가 점수가 주어졌을 때, 우승자와 그의 점수를 구하는 프로그램을 작성하시오.

입력

총 다섯 개 줄에 각 참가자가 얻은 네 개의 평가 점수가 공백으로 구분되어 주어진다. 첫 번째 참가자부터 다섯 번째 참가자까지 순서대로 주어진다. 항상 우승자가 유일한 경우만 입력으로 주어진다.

출력

첫째 줄에 우승자의 번호와 그가 얻은 점수를 출력한다.

 

 

 

 

 

이 문제는 두가지로 풀이해보았다. 첫 번째는 2차원 배열을 for문으로 일일이 푸는것이고, 두 번째는 포인터를 이용하여 배열에 접근하였다. 행 마다 합을 구해 그 합이 최댓값임을 판별하였다. 첫번째 풀이 코드이다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	int ar[5][4] = { 0 };
	int sum = 0, k = 0, n = 0;
	for (int j = 0; j < 5; j++)
	{
		k = 0;
		for (int i = 0; i < 4; i++)
		{
			scanf("%d", &ar[j][i]);
			k += ar[j][i];
		}
		if (k > sum)
		{
			sum = k;
			n = j;
		}
	}
	printf("%d %d", n + 1, sum);

	return 0;
}

포인터로 배열에 접근할때 입력도 같이 받았으면 좋았겠지만 원래 안되는건지 능력이 부족한건지 잘 안됐다. 그래서 2차원 배열을 저장해놓고, 포인터를 이용해 그 배열을 운행하기로 했다. 먼저 시작점 포인터 *st를 배열의 첫 원소로 선언한다. 그리고 끝점 포인터 *end를 배열의 마지막 원소로 정했다. 그리고 st를 하나씩 늘려가면서 ar에 접근하면 된다. 행마다의 합은 변수를 이용하여 변수가 열의 개수인 4의 배수가 될때마다 구하도록 하였다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	int ar[5][4] = { 0 };
	int sum = 0, k = 0, n = 0;
	for (int j = 0; j < 5; j++)
	{
		for (int i = 0; i < 4; i++)
		{
			scanf("%d", &ar[j][i]);
		}
	}
	int* st;
	st = &ar[0][0];
	int* end;
	end = &ar[4][3];
	int i = 0;
	while (st <= end)
	{
		
		k += *st;
		st++;
		i++;
		if (i % 4 == 0)
		{
			if (k > sum)
			{
				sum = k;
				n = i / 4;
			}
			k = 0;
		}
		
	}
	printf("%d %d", n, sum);
	
		

	return 0;
}

 

 

 

 

 

댓글

💲 추천 글