flow-vector
Published 2023. 1. 18. 15:22
BOJ - 2309 일곱난쟁이 PS/BOJ

문제 링크

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

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

시간, 공간 제한

- 시간 제한 : 2초

- 메모리 제한 : 128MB

 

초기 문제 접근 방향

1. 입력이 9이고 시간제한이 2초 이므로 모든 경우의 수를 탐색할 때 시간초과에 걸리지 않을 수 있겠다고 생각

2. 모든 경우의 수의 경우 조합으로 알 수 있음 

  • 9개 중 순서에 상관없이 7개를 뽑고 뽑은 것들의 합이 100 이되면 출력하자!
  • 조합은 재귀의 방식으로 구현 해보자
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

int n = 9;
int k = 7;
int	a[9];

vector<vector<int> > ans;
void comb(int start, int *a, vector<int> b)
{
	if (b.size() == k)
	{
		if (accumulate(b.begin(), b.end(), 0) == 100)
			ans.push_back(b);
		return ;
	}
	for (int i = start + 1; i < n; ++i)
	{
		b.push_back(a[i]);
		comb(i, a, b);
		b.pop_back();
	}
}

int main(void)
{
	for (int i = 0; i < n; ++i)
		cin >> a[i];
	sort(a, a + n);
	vector<int> b;
	b.reserve(7);
	ans.reserve(100);
	comb(-1, a, b);
	for (auto i : ans[0])
		cout << i << "\n";
	return (0);
}

문제 접근 다른 방향

  • pre-fix sum
    • 전체 난쟁이의 키의 합을 구한뒤 2명의 난쟁이의 키를 뺐을 때 100이되면 해당 난쟁이들의 번호를 기억 해놓기
    • 구한 난쟁이 번호를 제외 하고 출력
#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>

using namespace std;

int a[9];
int sum = 0;
vector<int> ans;
pair<int, int> ret;

void solve()
{
	for (int i = 0; i < 9; ++i)
	{
		for (int j = i + 1; j < 9; ++j)
		{
			if (sum - a[i] - a[j] == 100)
			{
				ret = {i, j};
				return ;
			}
		}
	}
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	for (int i = 0; i < 9; ++i)
	{
			cin >> a[i];
			sum += a[i];
	}
	solve();
	for (int i = 0; i < 9; ++i)
	{
		if (ret.first == i || ret.second == i)
			continue;
		ans.push_back(a[i]);
	}
	sort(ans.begin(), ans.end());
	for (auto i : ans)
		cout << i << '\n';
	return (0);
}

'PS > BOJ' 카테고리의 다른 글

BOJ 9375 패션왕 신해빈  (0) 2023.02.08
BOJ 6064 카잉 달력  (0) 2023.02.08
BOJ - 9996  (0) 2023.02.01
profile

flow-vector

@flow-vector

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!