반응형
문제 출처 :
https://www.acmicpc.net/problem/1759
알고리즘 분석 :
문제 해결에 필요한 사항
1. 백트래킹(Backtracking)
[2661번] 좋은 수열 :: http://www.crocus.co.kr/657
위의 문제를 풀고 이 문제를 풀어도 도움이 많이 되고, 이 문제를 풀고 위의 문제를 풀어도 도움이 많이 된다.
백트래킹에 대한 전반적인 지식이 있어야 한다.
백트래킹도 dfs의 일종이지만, dfs를 자유자제로 이용할 수 있지 않는한 백트래킹을 생각해내기가 어렵다.
원리는 다음과 같다.
우선 char 배열에 문자를 받아주고, 정렬을 해준다.(정렬을 해야 사전 순으로 나타날 수 있다.)
스트링의 크기가 n이 될 때까지 순차적으로 계속 담아준다.
크기가 n이 되었을 때 자음, 모음이 각각 2개 1개 이상씩 있는지 검사해주고 없다면 return을 있다면 출력을 해준다.
백트래킹중에 파라미터로 str, 자음, 모음 수를 추가해준 것이니 return을 받게되면 다시 그 다음값을 넣어주는 방식을 취하게 된다.
이 문제를 접한 코더들이라면 위의 추천 문제는 꼭 풀어봤으면 하는 문제이다.
소스 코드 :
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 38 39 40 41 42 43 44 45 | #include <iostream> #include <cstdio> #include <algorithm> #include <string> using namespace std; int n, m; char arr[20]; void backTracking(int pos, string str, int ja, int mo) { if (str.size() == n) { if (ja < 2 || mo < 1) return; cout << str << endl; } for (int i = pos; i < m; i++) { if (arr[i] == 'a' || arr[i] == 'e' || arr[i] == 'i' || arr[i] == 'o' || arr[i] == 'u') backTracking(i + 1, str + arr[i], ja, mo + 1); else backTracking(i + 1, str + arr[i], ja + 1, mo); } } int main() { scanf("%d %d", &n, &m); for (int i = 0; i < m; i++) cin >> arr[i]; sort(arr, arr + m); backTracking(0,"",0,0); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[6603번] 로또 (7) | 2017.03.29 |
---|---|
[6549번] 히스토그램에서 가장 큰 직사각형 (7) | 2017.03.28 |
[1162번] 도로포장 (7) | 2017.03.28 |
[2468번] 안전 영역 (0) | 2017.03.27 |
[2302번] 극장 좌석 (0) | 2017.03.27 |