※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 5568번 문제인 카드 놓기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/5568
5568번: 카드 놓기
예제 1의 경우 상근이는 11, 12, 21, 112, 121, 122, 212를 만들 수 있다.
www.acmicpc.net
같은 카드를 두번 이상 사용하지 않으면서 K개 나열하는 순열들을 직접 생성해나가면서, 만들 수 있는 모든 정수를 set에 집어넣어 문제를 해결하자.
이 정수들은 수식으로 계산하면서 이어붙여나가도 되지만, 문자열의 덧셈을 이용하여 그냥 이어붙이는 것으로 구현하면 더 편하게 구현할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <set>
using namespace std;
int N, K;
string s[10];
string tmp = "";
bool visited[10];
set<string >st;
void func(int len) {
if (len == K) {
st.insert(tmp);
return;
}
for (int i = 0; i < N; i++) {
if (visited[i]) continue;
tmp += s[i];
visited[i] = 1;
func(len + 1);
visited[i] = 0;
int silen = s[i].length();
while (silen--) tmp.pop_back();
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
for (int i = 0; i < N; i++) cin >> s[i];
func(0);
cout << st.size();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 20942 // C++] 신촌지역 초중고등학생 프로그래밍 대회 동아리 연합 대회 (0) | 2022.08.12 |
---|---|
[BOJ 13308 // C++] 주유소 (0) | 2022.08.11 |
[BOJ 12758 // C++] 천상용섬 (0) | 2022.08.09 |
[BOJ 1348 // C++] 주차장 (0) | 2022.08.08 |
[BOJ 15508 // C++] Xayahh-Rakann at Moloco (Easy) (0) | 2022.08.07 |