Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 특정 조건에 맞춰 길이 N의 문자 시퀀스 생성하기

이 글에서 소개하는 C++ 프로그램은 기준(base) 문자열에서 문자를 무작위로 선택하여 중복되지 않는 길이 N의 문자 시퀀스를 여러 개 생성합니다. 난수 생성 함수 rand()를 활용하며, 이미 시퀀스에 포함된 문자는 다시 뽑지 않도록 처리하는 것이 핵심 로직입니다.

알고리즘

  1. rand() 함수를 사용해 기준 문자열 내의 무작위 인덱스를 생성합니다.
  2. 시퀀스의 첫 번째 문자는 별도의 검사 없이 그대로 저장합니다.
  3. 이후 문자부터는 이미 시퀀스에 존재하는지 확인하고, 중복된다면 해당 인덱스를 버리고 새로운 무작위 인덱스를 다시 생성합니다.
  4. 모든 문자가 채워지면 널 문자('\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을 사용하는 것이 더 안전한 방법입니다. 마지막으로 기준 문자열의 서로 다른 문자 개수보다 긴 시퀀스를 요청하면 중복 회피 로직이 무한히 반복될 수 있으므로, 입력 값 검증을 추가하는 것도 권장합니다.