이 글에서 소개하는 C++ 프로그램은 기준(base) 문자열에서 문자를 무작위로 선택하여 중복되지 않는 길이 N의 문자 시퀀스를 여러 개 생성합니다. 난수 생성 함수 rand()를 활용하며, 이미 시퀀스에 포함된 문자는 다시 뽑지 않도록 처리하는 것이 핵심 로직입니다.
알고리즘
rand()함수를 사용해 기준 문자열 내의 무작위 인덱스를 생성합니다.- 시퀀스의 첫 번째 문자는 별도의 검사 없이 그대로 저장합니다.
- 이후 문자부터는 이미 시퀀스에 존재하는지 확인하고, 중복된다면 해당 인덱스를 버리고 새로운 무작위 인덱스를 다시 생성합니다.
- 모든 문자가 채워지면 널 문자(
'\0')를 붙여 시퀀스를 완성합니다.
예제 코드
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
void GenerateSequence(char string[], int n, int l, char *sequence)
{
int i, j=0, k, in;
for(i = 0; i < n; i++) {
// 첫 번째 문자는 검사 없이 시퀀스에 바로 저장
if(j == 0)
sequence[j++] = string[rand()%l];
else {
h:
in = rand()%l;
for(k = 0; k < j; k++) {
if(string[in] == sequence[k])
goto h; // 중복 문자면 인덱스를 다시 추출
}
sequence[j++] = string[in];
}
}
sequence[j] = '\0'; // 널 문자로 시퀀스 종료
}
int main() {
int n, m, l, i;
char string[100];
cout<<"기준 문자열 입력: ";
cin>>string;
cout<<"\n생성할 시퀀스의 개수 입력: ";
cin>>n;
cout<<"\n각 시퀀스의 길이 입력: ";
cin>>m;
l = strlen(string);
for(i = 0; i < n; i++) {
char sequence[m];
GenerateSequence(string, m, l, sequence);
cout<<"\n시퀀스 "<<i+1<<": "<<sequence;
}
return 0;
}코드 구조 살펴보기
GenerateSequence() 함수는 네 개의 매개변수를 받습니다.
string[]— 문자를 추출할 기준 문자열n— 생성할 시퀀스의 길이l— 기준 문자열의 전체 길이*sequence— 결과를 저장할 배열 포인터
main() 함수에서는 사용자로부터 기준 문자열, 생성할 시퀀스 개수, 각 시퀀스의 길이를 차례로 입력받은 뒤, 반복문을 통해 원하는 개수만큼 시퀀스를 생성하고 출력합니다.
실행 결과
기준 문자열 입력: tutorialspoint 생성할 시퀀스의 개수 입력: 7 각 시퀀스의 길이 입력: 6 시퀀스 1: tuanol 시퀀스 2: itlurp 시퀀스 3: tonaiu 시퀀스 4: untlri 시퀀스 5: liorpt 시퀀스 6: liusto 시퀀스 7: luisot
참고 사항
예제 코드는 흐름 제어를 위해 goto 문을 사용하지만, 실무에서는 코드 가독성과 유지보수를 위해 while(true) 반복문과 break/continue로 대체하는 것이 좋습니다. 또한 char sequence[m]처럼 배열 크기를 변수로 지정하는 가변 길이 배열(VLA)은 표준 C++이 아니므로, 컴파일러 호환성을 고려하면 std::vector<char>나 std::string을 사용하는 것이 더 안전한 방법입니다. 마지막으로 기준 문자열의 서로 다른 문자 개수보다 긴 시퀀스를 요청하면 중복 회피 로직이 무한히 반복될 수 있으므로, 입력 값 검증을 추가하는 것도 권장합니다.