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
- AWS
- Coercion
- BOJ 2146
- DP
- BOJ 1912
- BOJ 2407
- BOJ 2213
- BOJ 4948
- BOJ 5791
- MySQL
- BOJ 6593
- BOJ 2234
- spring security
- javascript
- BOJ 1074
- BOJ 11726
- BOJ 1926
- 조합 알고리즘
- Lambda
- BOJ 2167
- 플로이드 와샬
- BOJ 4485
- 다익스트라
- priority_queue
- springboot
- BOJ 2012
- BOJ 5568
- BOJ 1697
- 분할과 정복
- serverless
Archives
- Today
- Total
고인물을 지양하는 블로그
BOJ 5568 카드 놓기 본문
https://acmicpc.net/problem/5568
재귀를 이용해 모든 경우의 수를 구하고, 이를 set에 넣어 해결했다.
호출 stack 깊이(cnt)는 K, X는 수열에 추가할 수가 된다. backtrack 된 위치에서 방문했던 위치를 방문하지 않았다고 바꾸면 다음 loop의 재귀 호출에서 다시 사용될 수 있다. 위와 같은 방법으로 K가 3인 모든 수의 조합을 생성할 수 있고, 이를 std::set에 넣으면 중복 없는, 생성 가능한 모든 수의 개수를 구할 수 있다.
코드는 다음과 같다.
#include <iostream>
#include <string>
#include <set>
using namespace std;
int a[11], N, K;
bool visited[11];
set<string> comb;
auto P(int x, int cnt, string s) {
if (cnt == K) return comb.insert(s); // k개 선택하면 끝
for (int i = 0; i < N; i++) { // 선택 가능한 모든 원소에 대해
if (!visited[i]) { // 이전에 선택된 원소는 다시 선택 안하도록
visited[i] = true; // 현재 선택한 원소 방문 체크
P(i, cnt + 1, s + to_string(a[i])); // cnt 증가하고 생성한 문자열에 추가
visited[i] = false; // backtrack된 위치에서 선택했던 원소 방문 취소
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> K;
for (int i = 0; i < N; i++) cin >> a[i];
P(0, 0, "");
cout << comb.size();
}
확장이 쉬운 string을 이용해 수를 관리했다.
dp & 조합 관련 문제들에서 자존감이 박살나는 바람에 이틀 가까운 시간 동안 kaggle, 모두의 딥러닝 강의 들으며 요양했다...
'Algorithms > ACMICPC(백준)' 카테고리의 다른 글
BOJ 14502 연구소 (0) | 2019.08.06 |
---|---|
BOJ 14499 주사위 (0) | 2019.08.02 |
BOJ 2167 2차원 배열의 합 (0) | 2019.07.23 |
BOJ 1912 연속합 (0) | 2019.07.17 |
BOJ 4948 베르트랑 공준 (0) | 2019.07.16 |
Comments