Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 댓글
- 재귀
- 인스타그램
- 좋아요
- 다리 만들기2
- 미세먼지 안녕!
- 17136
- 로또
- 알고리즘
- Java
- 14888
- 6603
- 1182
- 부분수열의 합
- 9095
- 구슬탈출2
- 괄호추가하기
- 따라하기
- 인스타
- 연산자 끼워넣기
- 17143
- Ajax
- 장고
- 17472
- 14502
- 17144
- django
- 백준
- 색종이 붙이기
- 16637
Archives
- Today
- Total
Be a developer
백준 6603 로또 본문
이 문제는 배열 안에 중복된 수가 있어도 next_permutation이 잘 작동한다는 것을 이용해서 푼다.
예시와 같이 k=8, s={1,2,3,5,8,13,21,34}인 경우 0을 먼저 6개 넣고, 다음에 1을 2개 넣어야 한다.
그렇게 되면 0 0 0 0 0 0 1 1과 같은 vector가 만들어지고, 이를 next_permutation을 사용해 섞으면 뒤에서 부터 섞이게 되어 모든 순열을 다 검사할 수 있다.
만약 1을 6개 먼저 넣고 0을 2개 넣게 되면, 1 1 1 1 1 1 0 0 과 같은 vector가 만들어지고, 모든 순열을 다 검사하지 못하게 된다.
원소는 오름차순으로 입력받기 때문에 sorting할 필요가 없다.
0과 1을 vector에 넣을 때 조심해야 한다.
vector<int> v(n)과 같이 선언할 경우 n개의 공간이 이미 만들어지기 때문에 v.push_back으로 원소를 넣을 경우 n+1번 째부터 값이 들어간다. v[n-1]에 값을 넣고 싶은 경우 v[n-1] = 1; 이렇게 넣어야 된다는 말이다.
v.push_back(1)로 넣으면 v[n]의 값이 1이 된다.
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 | #include <iostream> #include <algorithm> #include <vector> using namespace std; int main(int argc, char** argv) { int k; int s[13]; while (1) { cin >> k; if (k == 0)break; vector<int> s(k); for (int i = 0; i < k; i++)cin >> s[i]; vector<int>v(k); for (int i = 0; i < 6; i++)v[i] = 0;//처음 6개의 수를 0으로 넣는다. for (int i = 6; i < k; i++)v[i] = 1;//나머지 수를 1로 넣는다. do { for (int i = 0; i < k; i++) { if (v[i] == 0)printf("%d ", s[i]); } printf("\n"); } while (next_permutation(v.begin(), v.end())); printf("\n"); } return 0; } | cs |
'알고리즘' 카테고리의 다른 글
백준 9095 1,2,3 더하기 (재귀) (0) | 2019.04.01 |
---|---|
백준 14888 연산자 끼워넣기 (0) | 2019.04.01 |
백준 10971 외판원 순회 2 (0) | 2019.03.29 |
알고리즘 풀면서 참고할 사항들 (0) | 2019.03.27 |
백준 10819 차이를 최대로 (0) | 2019.03.27 |
Comments