https://www.acmicpc.net/problem/1759
C개의 수를 입력받아서 길이 L의 수열을 출력하면 된다.
입력은 소문자로만 들어오고, 정렬되어서 들어오지 않는다.
출력되는 수열은 오름차순 정렬 상태여야 하기 때문에 입력을 받은 이후에 정렬이 필요하다. 그리고 사전순의 상태를 유지하기 위해서 st라는 변수를 두어서 이전에 사용된 문자의 인덱스를 관리한다.
문자의 길이가 0이 되면 이 전에 사용한 문자의 인덱스가 존재하지 않기 때문에 0으로 처리해준다.
문자를 중복해서 사용할 수 없기 때문에 특정 인덱스의 문자가 사용중인지 여부를 판단하는 배열이 필요하다.
출력되는 문자열의 문자 사이사이에 공백이 당연히 포함된다고 생각해서 공백까지 출력해서 맞왜틀을 반복했다.
출력 형식을 잘 확인하도록 하자.
#include<iostream> #include<algorithm> using namespace std; int L, C, st; char n[15], arr[15]; bool isused[15]; bool Check() { int cntM = 0, cntJ = 0; for (int i = 0; i < L; i++) { if (arr[i] == 'a' or arr[i] == 'e' or arr[i] == 'i' or arr[i] == 'o' or arr[i] == 'u') cntM++; else cntJ++; } if (cntM >= 1 && cntJ >= 2) //모음1, 자음2개가 있어야 true return true; else return false; } void func(int k) { if (k == L) { if (Check()) { for (int i = 0; i < L; i++) cout << arr[i]; cout << '\n'; } return; } if (k == 0) st = 0; for (int i = st; i < C; i++) { if (!isused[i]) { arr[k] = n[i]; isused[i] = true; st = i; func(k + 1); isused[i] = false; } } } int main(void) { cin >> L >> C; for (int i = 0; i < C; i++) cin >> n[i]; sort(n, n + C); func(0); return 0; }
'알고리즘 문제 풀이 > 오답' 카테고리의 다른 글
연산자 우선 순위가 없는 경우 +, -, * 연산 구현 (0) | 2019.08.21 |
---|---|
[오답] 카카오 2018 블라인드 테스트: 무지의 먹방 라이브 C++ (0) | 2019.08.20 |
[오답] 백준 1941 소문난 칠공주 C++ (0) | 2019.08.10 |
[오답] 백준 1799번: 비숍 (C++) (0) | 2019.07.24 |
[오답] 백준 9663번: N-Queen (C++) (0) | 2019.07.21 |