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

이번 글을 통해 배워갈 내용
- 백준 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
'C++ > C++ 알고리즘' 카테고리의 다른 글
| 백준 21867번 JAVA BiteCode C++로 구현해보기 (0) | 2021.09.01 |
|---|---|
| 백준 17174번 전체 계산 횟수 C++로 구현해보기 (0) | 2021.08.31 |
| 백준 17548번 Greetings C++로 구현해보기 (0) | 2021.08.31 |
| 백준 14648번 쿼리 맛보기 C++로 구현해보기 (0) | 2021.08.31 |
| 백준 14647번 (가장 9가 많은 열 혹은 행 찾아서 전체 9 숫자에서 빼기) C++로 구현해보기 (0) | 2021.08.30 |