BOJ 백준 2309 : 일곱 난쟁이
Updated:
시작하면서
이번 문제는 완전 탐색(Brute Force Search) 문제이다.
문제 이해
문제를 읽어보자. 먼저 이 문제에서 나오는 변수는 총 1가지이다.
- 아홉 난쟁이의 키
문제 아이디어
난쟁이의 수가 9명이고, 이중 7명의 난쟁이 키 합이 100인 경우를 구해야한다. 경우의 수가 충분히 작으므로 모든 경우를 다 해보는 완전 탐색을 이용하면 좋다.
- 난쟁이를 한 명씩 앞에서부터 순서대로 넣어보면서 7명까지 넣었을 때 키의 합이 100이 되는지 검사한다.
- 100이라면 그대로 계산을 종료하고, 100이 아니라면 한 명을 빼고 다른 한 명을 넣으면서 다시 확인한다.
해결
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define SEVEN_STATURE_SUM (100)
#define SEVEN_DWARF_COUNT (7)
#define ALL_DWARF_COUNT (9)
bool FindSevenStature(const vector<int>& dwarfStature, vector<int>& sevenStature)
{
if (sevenStature.size() == SEVEN_DWARF_COUNT)
{
int statureSum = 0;
for (int i = 0; i < sevenStature.size(); i++)
{
statureSum += sevenStature[i];
}
if (statureSum == SEVEN_STATURE_SUM)
return true;
else
return false;
}
for (int i = 0; i < dwarfStature.size(); i++)
{
vector<int>::iterator iter = find(sevenStature.begin(), sevenStature.end(), dwarfStature[i]);
if (iter == sevenStature.end())
{
sevenStature.push_back(dwarfStature[i]);
if (FindSevenStature(dwarfStature, sevenStature) == true)
return true;
sevenStature.pop_back();
}
}
return false;
}
int main()
{
// sync off
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// sync off
vector<int> dwarfStature;
vector<int> sevenStature;
for (int i = 0; i < ALL_DWARF_COUNT; i++)
{
int stature;
cin >> stature;
dwarfStature.push_back(stature);
}
FindSevenStature(dwarfStature, sevenStature);
sort(sevenStature.begin(), sevenStature.end(), less<>());
for (int i = 0; i < sevenStature.size(); i++)
{
cout << sevenStature[i] << "\n";
}
return 0;
}
마치며
자꾸 런타임 에러가 떠서 어떤 부분이 문제인가 찾아봤는데 함수 마지막 줄에 return false;를 빼먹었었다. 다음부터는 조심하자.
Leave a comment