πŸ“ Coding Test Study/C++

[10μ£Ό μ™„μ„± C++ μ½”λ”©ν…ŒμŠ€νŠΈ] ν•„μˆ˜κ°œλ… - μˆœμ—΄(Permutation), μ‘°ν•©(Combination)

ibelieveinme 2023. 8. 3. 18:25
728x90

μˆœμ„œμ™€ 상관 O λ½‘λŠ”λ‹€λ©΄ >> μˆœμ—΄

μˆœμ„œμ™€ 상관 X λ½‘λŠ”λ‹€λ©΄ >> μ‘°ν•©

 

μˆœμ„œλ₯Ό μž¬λ°°μΉ˜ν•˜μ—¬ ...

~ν•œ μˆœμ„œμ˜ 경우 max 값을 κ΅¬ν•˜μ‹œμ˜€ λ“±λ“±μ˜ 문제 >> μˆœμ—΄ !


* μˆœμ—΄ ν•¨μˆ˜

next_permutation(μ˜€λ¦„μ°¨μˆœ)

prev_permutation(λ‚΄λ¦Όμ°¨μˆœ)

 

* μ˜ˆμ‹œ μ½”λ“œ

#include <bits/stdc++.h>
using namespace std; 

int main() { 
    int a[] = {1,2,3};
    do{
        for(int i : a) cout << i << " ";
        cout << "\n";
    } while(next_permutation(&a[0], &a[0] + 3)); // from, to
    return 0; 
}

κ²°κ³Ό

1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 

 

#include <bits/stdc++.h>
using namespace std; 

int main() { 
    int a[] = {1,2,3};
    do{
        for(int i : a) cout << i << " ";
        cout << "\n";
    } while(next_permutation(a, a + 3)); // from, to
    return 0; 
}

&a[0] μ΄λ ‡κ²Œ μ•ˆμ“°κ³  a 만 써도 κ°€λŠ₯ν•˜λ‹€.

#include <bits/stdc++.h>
using namespace std; 

int main() { 
    vector<int> a = {2,1,3};
    
    sort(a.begin(), a.end());
    do{
        for(int i : a) cout << i << " ";
        cout << "\n";
    } while(next_permutation(a.begin(), a.end())); // from, to
    
    return 0; 
}

벑터인 경우 begin, end ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ ν˜ΈμΆœν•œλ‹€.

μˆœμ„œμ •λ ¬μ΄ μ•ˆλ˜μ–΄ μžˆλ‹€λ©΄ κ·Έ λ‹€μŒ 경우의 μˆ˜λΆ€ν„° κ΅¬ν•΄μ§€λ―€λ‘œ μˆœμ—΄ν•¨μˆ˜ μ‚¬μš© 전에 정렬을 κΌ­ ν•΄μ•Ό ν•œλ‹€.

경우의 수 개수λ₯Ό κ΅¬ν•˜λŠ” 곡식도 μ•Œμ•„λ‘μž.

* μ‘°ν•©

[μ‘°ν•© 경우의 수 κ°œμˆ˜κ΅¬ν•˜λŠ” 곡식]

 

[κ΅¬ν˜„λ°©λ²•]

1) μž¬κ·€ν•¨μˆ˜(4개 이상 뽑을 λ•Œ μΆ”μ²œ) μ•”κΈ°β˜…β˜…β˜…β˜…β˜…

#include <iostream>
#include <vector>
using namespace std;

int n = 5, k = 3, a[5] = { 1, 2, 3, 4, 5 }; // 5C3

void print(vector<int> v) {
	for (int i : v) cout << a[i] << " ";
	cout << "\n";
}

void combi(int start, vector<int> v) {
	if (v.size() == k) {
		print(v);
		return;
	}
	for (int i = start + 1; i < n; i++) {
		v.push_back(i);
		combi(i, v);
		v.pop_back();
	}
	return;
}

int main() {
	vector<int> v;
	combi(-1, v);
	return 0;
}

 

2) 쀑첩 forλ¬Έ(3개 μ΄ν•˜λ‘œ 뽑을 λ•Œ μΆ”μ²œ. κ΅¬ν˜„μ΄ 간단함.)

 

 

728x90