- 문제
- 풀이
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int input[9] = { 0 };
for (int i = 0; i < 9; i++)
{
cin >> input[i];
}
sort(input, input + 9);
do
{
int sum = 0;
for (int i = 0; i < 7; i++)
{
sum += input[i];
}
if (sum == 100)
{
break;
}
} while (next_permutation(input, input + 9));
for (int i = 0; i < 7; i++)
{
cout << input[i] << '\n';
}
return 0;
}
- 메모
문제의 기본 원리는 9개의 수 중에서 7개의 수를 조합해 그 합이 100이 되는 경우 해당값들을 출력하는 것이다.
DFS 등으로 구하는 방법도 있지만 값을 빠르게 찾기 위해서 순열과 조합을 구할 때 유용한 algrorithm 헤더에 있는 next_permutaion() 함수를 사용했다.
<next_permutaion() 함수>
이 함수는 값이 들어있는 컨테이너에서 원하는 범위를 입력하면 해당 범위 안의 값을 사전 순의 다음 순열로 바꾼 뒤, 해당 순열이 사전 상의 마지막이라면 true를, 마지막이 아니라면 false를 리턴해준다.
따라서 do-while문과 함께 해당 함수를 사용하면 해당 값을 사용해 만들 수 있는 모든 순열의 경우를 만들 수 있게 된다.
주의할 점은 모든 경우의 수를 따져보기 위해서는 해당 함수를 사용하기 전에 먼저 sort 함수로 컨테이너의 값을 오름차순으로 정렬해주어야 한다는 점이다.
이와 비슷하게 내림차순으로 구하는 함수로는 prev_permutation()이 있다.
https://cplusplus.com/reference/algorithm/next_permutation/
https://cplusplus.com/reference/algorithm/next_permutation/
function template <algorithm> std::next_permutation default (1)template bool next_permutation (BidirectionalIterator first, BidirectionalIterator last);custom (2)template bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, Compa
cplusplus.com
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[백준/14425번/C++] 문자열 집합 (0) | 2024.08.22 |
---|---|
[백준/10815번/C++] 숫자 카드 (0) | 2024.08.21 |
[백준/2587번/C++] 대표값2 (0) | 2024.08.19 |
[백준/2480번/C++] 주사위 세개 (0) | 2024.07.23 |
[백준/10828번/C++] 스택 (0) | 2024.07.16 |