C++/C++ 알고리즘

백준 16283번 farm C++로 구현해보기

kimc 2021. 8. 31. 22:54

```

백준 16283번 farm C++로 구현해보기

```

 

이번 글을 통해 배워갈 내용

  1.  백준 16283번 풀이

https://www.acmicpc.net/problem/16283

 

16283번: Farm

입력은 표준입력을 사용한다. 첫 번째 줄에 네 정수 a, b, n, w가 한 줄에 주어진다. 1 ≤ a ≤ 1,000, 1 ≤ b ≤ 1,000, 2 ≤ n ≤ 1,000, 2 ≤ w ≤ 1,000,000이다.

www.acmicpc.net

 

 

 

백준 16283번 Farm은

난이도 중하 등급의 문제로서

 

양 과 염소들이 목장안에 있고

 

양은 한마리당 a 만큼의 사료를 매일 먹고

염소는 한마리당 b 만큼의 사료를 매일 먹는다.

 

목장안에 양과 염소 숫자를 더하면 n 이다.

목장안에 염소와 양이 매일 먹는 사료의 양은 w이다.

 

이때 양과 염소의 숫자를 구해야 한다.

양과 염소의 숫자는 각 1 이상 1000 이하이며

정수이다.


30분 정도 위에 링크를 방문하셔서 풀어보시고

안풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.


저는 처음에 양과 염소가 정수라는 부분을 못봐서

2차 방정식을 만들고

 

y = (w-an)/(b-a)

x = (w-bn)/(a-b)

 

에서 a = b 일때, w = an 일때,  w=bn 일때를 고려해서 

푸는 문제인줄 알았으나......

 

 

알고보니

정수이기때문에 공식을 세우기 보다

brute force로

 

이중 for문 돌려서

i j 값이 두 조건 모두를 만족하고

두번 이상 조건 만족하지 않는 경우에

답을 출력해주면 되는

문제였습니다.

 

 

각 변수 선언해주고

유저로부터 입력값을 받습니다.

 

	/* 양 숫자 */
	int sheepNumber;
	/* 염소 숫자 */
	int goatNumber;

	/* 양한마리당사료량 a */
	int dailyFoodPerSheep;
	/* 염소한마리당사료량 b */
	int dailyFoodPerGoat;

	/* 동물 숫자 n*/
	int animalNumber;
	/* 하루 사료 량 W */
	int dailyFood;
public:
	CFarm()
	{
	}

	~CFarm()
	{
	}

	void getInputFromUser()
	{
		std::string inputString;
		std::getline(std::cin, inputString);
		std::stringstream ss(inputString);
		ss >> dailyFoodPerSheep;
		ss >> dailyFoodPerGoat;
		ss >> animalNumber;
		ss >> dailyFood;
	}

 

첫 3중 if문은 필요는 없으나

혹시 몰라서 답에 추가했고

 

else 부터 if 돌려서

i, j 가 조건을 한번 만 만족하면

답을 출력하고

 

그 외에는 -1을 출력합니다.

	void findAnswer()
	{
		bool noExactAnswer = true;
		if	((dailyFoodPerGoat != dailyFoodPerSheep)&&
			((dailyFood - (dailyFoodPerSheep * animalNumber)) != 0)&&
			((dailyFood - (dailyFoodPerGoat * animalNumber)) != 0))
		{
			if (((dailyFood - (dailyFoodPerGoat * animalNumber)) % (dailyFoodPerSheep - dailyFoodPerGoat)) == 0)
			{
				if (((dailyFood - (dailyFoodPerSheep * animalNumber)) % (-dailyFoodPerSheep + dailyFoodPerGoat)) == 0)
				{
					noExactAnswer = false;
					sheepNumber = (dailyFood - (dailyFoodPerGoat * animalNumber)) / (dailyFoodPerSheep - dailyFoodPerGoat);
					goatNumber = (dailyFood - (dailyFoodPerSheep * animalNumber)) / (-dailyFoodPerSheep + dailyFoodPerGoat);
					std::cout << sheepNumber << ' ' << goatNumber;
				}
			}
		}
		else
		{
			int count = 0;

			for (int i = 1; i < animalNumber; i++)
			{
				for (int j = 1; j < animalNumber; j++)
				{
					if (
						((i + j) == animalNumber) &&
						((i * dailyFoodPerSheep + j * dailyFoodPerGoat) == dailyFood)
						)
					{
						count++;
						sheepNumber = i;
						goatNumber = j;
						if (count == 2)
						{
							break;
						}
					}
				}
			}

			if (count == 1)
			{
				noExactAnswer = false;
				std::cout << sheepNumber << ' ' << goatNumber;
			}
		}

		if (noExactAnswer == true)
		{
			std::cout << -1;
		}


	}

 

 

전체 코드는 다음과 같습니다

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include<numeric>

// https://www.acmicpc.net/problem/16283

class CFarm
{
private:
	/* 양 숫자 */
	int sheepNumber;
	/* 염소 숫자 */
	int goatNumber;

	/* 양한마리당사료량 a */
	int dailyFoodPerSheep;
	/* 염소한마리당사료량 b */
	int dailyFoodPerGoat;

	/* 동물 숫자 n*/
	int animalNumber;
	/* 하루 사료 량 W */
	int dailyFood;
public:
	CFarm()
	{
	}

	~CFarm()
	{
	}

	void getInputFromUser()
	{
		std::string inputString;
		std::getline(std::cin, inputString);
		std::stringstream ss(inputString);
		ss >> dailyFoodPerSheep;
		ss >> dailyFoodPerGoat;
		ss >> animalNumber;
		ss >> dailyFood;
	}

	void findAnswer()
	{
		bool noExactAnswer = true;
		if	((dailyFoodPerGoat != dailyFoodPerSheep)&&
			((dailyFood - (dailyFoodPerSheep * animalNumber)) != 0)&&
			((dailyFood - (dailyFoodPerGoat * animalNumber)) != 0))
		{
			if (((dailyFood - (dailyFoodPerGoat * animalNumber)) % (dailyFoodPerSheep - dailyFoodPerGoat)) == 0)
			{
				if (((dailyFood - (dailyFoodPerSheep * animalNumber)) % (-dailyFoodPerSheep + dailyFoodPerGoat)) == 0)
				{
					noExactAnswer = false;
					sheepNumber = (dailyFood - (dailyFoodPerGoat * animalNumber)) / (dailyFoodPerSheep - dailyFoodPerGoat);
					goatNumber = (dailyFood - (dailyFoodPerSheep * animalNumber)) / (-dailyFoodPerSheep + dailyFoodPerGoat);
					std::cout << sheepNumber << ' ' << goatNumber;
				}
			}
		}
		else
		{
			int count = 0;

			for (int i = 1; i < animalNumber; i++)
			{
				for (int j = 1; j < animalNumber; j++)
				{
					if (
						((i + j) == animalNumber) &&
						((i * dailyFoodPerSheep + j * dailyFoodPerGoat) == dailyFood)
						)
					{
						count++;
						sheepNumber = i;
						goatNumber = j;
						if (count == 2)
						{
							break;
						}
					}
				}
			}

			if (count == 1)
			{
				noExactAnswer = false;
				std::cout << sheepNumber << ' ' << goatNumber;
			}
		}

		if (noExactAnswer == true)
		{
			std::cout << -1;
		}


	}
};

int main()
{
	std::cin.tie(NULL);
	std::ios::sync_with_stdio(false);

	CFarm* cFarm = new CFarm();

	cFarm->getInputFromUser();
	cFarm->findAnswer();
}

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩하시길 바랍니다 ~ :)

 

참조 및 인용

C++ Primer

Introduction to Algorithms


https://codemasterkimc.tistory.com/35

 

C++ 이론을 배울수 있는 곳 정리

개요  C++을 배우는 책, 강의, 블로그, 링크 등을 공유합니다. (링크 및 간략한 설명을 하였으나 만약 원작자가 링크를 거는것을 원치 않을 경우 연락주시기 바랍니다.) 서적 https://www.amazon.com/Prime

codemasterkimc.tistory.com

 

https://codemasterkimc.tistory.com/50

 

300년차 개발자의 좋은 코드 5계명 (Clean Code)

이번 글을 통해 배워갈 내용  좋은 코드(Clean Code)를 작성하기 위해 개발자로서 생각해볼 5가지 요소를 알아보겠습니다. 개요 좋은 코드란 무엇일까요? 저는 자원이 한정적인 컴퓨터 세상에서 좋

codemasterkimc.tistory.com

 


 

728x90