728x90
반응형
https://www.acmicpc.net/problem/1759
1759번: 암호 만들기
첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.
www.acmicpc.net
암호를 구성하는 여러 조건이 주어졌을 때 주어진 조건을 모두 충족하는 가능한 모든 암호를 구하는 문제이다.
암호를 구성하는 조건들은 다음과 같다.
1. 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있다.
2. 암호를 이루는 알파벳이 암호에서 증가하는 순서로 배열되어있다.
모음인지 자음인지 구별하는 함수와 알파벳 순인지 구별하는 함수를 만들어서 구현했다.
사실 알파벳 순인지 구별하는 함수는 이미 소트로 문자열을 정렬해줬기 때문에 굳이 구현하지 않아도 되는 함수였다.
너무 정신없이 만들어서 만들고 나서 깨달았다..
이렇게 문자열을 다루는 문제는 거의 안풀어봐서 문자열을 다루는데는 많이 미숙한 것 같다. 문자열 다루는 연습을 더 해야겠다.
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
char str[20], answer[20];
int cheak[20]={0,};
int L, C, k=0;
bool is_m(char m)
{
if(m=='a' || m=='e' || m=='i' || m=='o' || m=='u')
return true;
else
return false;
}
bool is_right(char a, char b)
{
if(a-b < 0)
return true;
else
return false;
}
void make_code(int now, int topick, int m, int j)
{
if(topick==0 && m>=1 && j>=2) // 기저상태 : 모두 골랏을 때
{
for(int i=0;i<L;i++)
printf("%c",answer[i]);
printf("\n");
return;
}
else if(topick==0)
{
return;
}
for(int i=0;i<C;i++)
{
if(k==0 && cheak[i]==0)
{ // 첫번째 글자는 아무거나 넣는다.
cheak[i]=1;
answer[k++]=str[i];
if(is_m(str[i]))
make_code(i+1, topick-1,m+1,j);
else
make_code(i+1, topick-1,m,j+1);
cheak[i]=0;
k--;
}
else if(m<1 && cheak[i]==0 && is_m(str[i]) && is_right(answer[k-1],str[i]))
{ // 모음이 1개보다 작다면 모음부터 넣는다.
cheak[i]=1;
answer[k++]=str[i];
if(is_m(str[i]))
make_code(i+1, topick-1,m+1,j);
else
make_code(i+1, topick-1,m,j+1);
cheak[i]=0;
k--;
}
else if(j<2 && cheak[i]==0 && is_m(str[i])==false && is_right(answer[k-1],str[i]))
{ // 자음이 2개보다 작다면 자음부터 넣는다.
cheak[i]=1;
answer[k++]=str[i];
if(is_m(str[i]))
make_code(i+1, topick-1,m+1,j);
else
make_code(i+1, topick-1,m,j+1);
cheak[i]=0;
k--;
}
else if(cheak[i]==0 && is_right(answer[k-1],str[i]))
{ // 모음도 자음도 조건을 충족한다면 아무거나 넣는다.
cheak[i]=1;
answer[k++]=str[i];
if(is_m(str[i]))
make_code(i+1, topick-1,m+1,j);
else
make_code(i+1, topick-1,m,j+1);
cheak[i]=0;
k--;
}
}
}
int main()
{
scanf("%d %d",&L,&C);
for(int i=0;i<C;i++)
scanf("%s",&str[i]);
sort(str,str+C);
make_code(0,L,0,0);
return 0;
}
728x90
반응형
'PS(Problem Solving) > 백준(BOJ)' 카테고리의 다른 글
[백준][10866번][C/C++] 덱 (0) | 2020.12.17 |
---|---|
[백준][9345번][C] 디지털 비디오 디스크(DVDs) (0) | 2020.11.22 |
[백준][10815번][C++] 숫자 카드 (0) | 2020.11.22 |
[백준][2004번][C++] 조합 0의 개수 (0) | 2020.11.20 |
[백준][1707번][C++] 이분 그래프 (0) | 2020.11.16 |