Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 목표 문자열과 일치할 때까지 무작위 문자열 생성하기

하나의 문자열이 주어졌을 때, 이 글에서는 영문 소문자·대문자, 숫자, 특수문자 등을 무작위(random)로 조합하여 새로운 문자열을 계속 생성하고, 그 결과가 주어진 목표 문자열과 일치할 때까지 반복하는 방법을 다룹니다.

이 기법은 '무한 원숭이 정리(Infinite Monkey Theorem)'를 코드로 구현한 것으로, random 모듈의 동작 원리와 문자열 비교 로직을 재미있게 학습할 수 있습니다.

예시

입력
PP

출력
AK
AK
.
.
.
.
.

목표 문자열 "PP"와 길이가 같은 무작위 문자열이 매 반복마다 출력되고, 결국 "PP"와 정확히 일치하는 순간 프로그램이 종료됩니다.

알고리즘

Step 1: 목표가 되는 문자열을 입력받는다.
Step 2: 소문자, 대문자, 숫자, 특수문자로 만들 수 있는 모든 후보 문자들을 하나의 변수에 저장한다.
Step 3: 두 개의 반복문과 random 함수를 사용하여 문자와 기호의 가능한 모든 조합을 얻는다.
Step 4: 각 반복마다 생성된 무작위 문자열을 화면에 출력하고, 목표 문자열과 한 글자씩 비교한다.
Step 5: 인덱스 위치의 문자가 일치하면 해당 문자를 고정하고, 일치하지 않으면 새로운 무작위 문자를 선택하여 나머지 부분을 계속 시도한다.

동작 방식 상세 설명

핵심 아이디어는 일치한 자리는 그대로 유지하고, 일치하지 않은 자리만 다시 뽑는 것입니다. 매 반복(iteration)마다:

1. 현재 시도 중인 문자열을 출력합니다.
2. 목표 문자열과 같은 길이만큼 한 글자씩 비교합니다.
3. 이미 목표 문자와 일치한 위치는 그 문자를 그대로 가져오고, 일치하지 않은 위치에는 후보 문자 집합에서 무작위로 새 문자를 선택합니다.
4. 전체 문자열이 완전히 일치하면 반복을 종료하고 총 시도 횟수를 출력합니다.

예제 코드

import string
import random
import time

# 사용 가능한 모든 후보 문자(소문자 + 숫자 + 대문자 + 특수문자)
my_possibleCharacters = string.ascii_lowercase + string.digits \
                        + string.ascii_uppercase + ' ., !?;:'

t = "ab"

# 첫 번째 무작위 시도 문자열 생성
my_attemptThis = ''.join(random.choice(my_possibleCharacters)
                          for i in range(len(t)))
my_attemptNext = ''
com = False
iteration = 0

# 일치가 완료될 때까지 반복
while com == False:
    print(my_attemptThis)
    my_attemptNext = ''
    com = True
    for i in range(len(t)):
        if my_attemptThis[i] != t[i]:
            com = False
            my_attemptNext += random.choice(my_possibleCharacters)
        else:
            my_attemptNext += t[i]
    # 반복 횟수 증가
    iteration += 1
    my_attemptThis = my_attemptNext
    time.sleep(0.1)

# 드라이버 코드
print("String matched after " + str(iteration) + " iterations")

코드 해설

string.ascii_lowercase, string.ascii_uppercase, string.digits를 연결하고 여기에 공백과 특수문자를 더해 후보 문자 집합을 구성했습니다. random.choice() 함수는 이 집합에서 하나의 문자를 무작위로 선택하며, time.sleep(0.1)은 진행 과정을 눈으로 확인할 수 있도록 각 반복 사이에 0.1초의 지연을 줍니다.

출력 결과

36
G
sM
,L
jt
g1
FN
uR
;W
Ja
3n
4o
Gl
kY
NR
oR
Nw
Lg
Jt
Od
wN
z0
J
3a
9J
sF
v
g6
HO
Ia
AB
Xa
OX
:N
Wo
Dp
f;
tt
kf
Er
In
ou
bD
T
a0
aH
aW
a
a8
ai
ax
az
aN
aJ
ah
a0
a.
aq
ar
ax
ai
am
a;
aO
as
a;
aS
aL
aQ
a8
a3
ae
a5
aS
ao
al
aV
ar
aj
aT
aS
ad
ab
String matched after 83 iterations

실행 결과를 보면 앞 글자 'a'가 먼저 일치한 이후에는 첫 번째 자리가 'a'로 고정되고, 두 번째 자리만 계속 바뀌다가 마침내 'b'가 선택되어 총 83번의 반복 만에 목표 문자열 "ab"와 일치하게 됩니다.

마무리

이 예제는 단순해 보이지만, 무작위성(randomness)과 점진적 수렴(progressive convergence)의 개념을 직관적으로 보여주는 좋은 학습 자료입니다. 목표 문자열이 길어질수록 필요한 반복 횟수는 기하급수적으로 늘어나므로, 직접 다양한 문자열로 실험해 보면서 확률과 시간의 관계를 체감해 보시기 바랍니다.