컴퓨팅적 스킬
- do while ~ (next_permutation)으로 계속해서 다음 조합의 경우의 수를 찾는다.
- vector v, check변수를 선언하여 permutation을 수행한다. 9명중 7명을 뽑아야하므로 7명만큼 check=true로 변경해서 수행한다. next_permutation을 수행하면서 값들이 계속변경되기 때문에 값이 변경되면서 출력된다.
컴퓨팅적 사고
- 백설공주를 도와 키를 확인하여 난쟁이를 찾자. 9명의 난쟁이 중에 7명의 난쟁이를 골라 키의 합이 100이 되는 경우를 찾아야한다.
- 9명중에 7명을 고르는 것은 9C7 = 9C2와 같은 경우의 수이다.
- 9명중 2명을 골랐을때 두명을 고르는 수는 O(N^2) * 난쟁이의 키의 합을 고르는 복잡도 O(N) = O(N^3)의 시간복잡도를 갖는다. N=9명이므로 9^3 = 729의 모든경우의 수에서 찾을 수 있다.
- 경우 1)난쟁이가 아닌 9명중 2명을 뽑는 경우를 구해서 sum의 값에서 그 해당 값들을 뺐을때 합이 100인경우를 찾는다.
- 경우 2)next_permutation을 돌려서 9명중 7명을 선택해서 그 값이 100일때 그 값들을 출력시켜준다. 이때 check변수를 선언하여 7명을 선택해야하는 경우를 true로 바꾸어주면서 수행한다.
주의해야 할점: 정렬이 되어있는 상태여야 한다.
풀이
이중 포문
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <stdio.h> #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(void){ int n = 9; int sum = 0; vector<int> v(n); for(int i=0; i<n; i++){ cin >> v[i]; sum += v[i]; } sort(v.begin(), v.end()); for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ if(sum - v[i] - v[j] == 100){ for(int z=0; z<n; z++){ if(i == z || j == z){ continue; } cout << v[z] << '\n'; } break; } } } return 0; }
|
next_permutation 조합
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <stdio.h> #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(void){ int n = 9; vector<int> v(n); vector<bool> check(n); for(int i=0; i<n; i++){ cin >> v[i]; } for(int i=0; i<7; i++){ check[i] = true; } sort(v.begin(), v.end()); do { int sum = 0; for(int i=0; i<n; i++){ if(check[i] == true){ sum += v[i]; } } if(sum== 100){ for(int i=0; i<7; i++){ cout << v[i] << "\n"; } break; } } while (next_permutation(v.begin(),v.end())); }
|