티스토리 뷰
알고리즘
1. 전체 수에 대한 경우의 수의 배열을 생성한다.
2. 해당 알고리즘에서 랜덤 숫자와 같은 스트라이크, 볼 수를 가진 경우의 수를 제거
3. 스트라이크가 3일 때 혹은 전체 경우의 수의 배열이 1개가 남을 때 종료
import random
import string
allCount=0
count=0
## 몇 번 돌릴지 결정
while allCount<1000:
allCount+=1
arrNum2=[str(i).zfill(3) for i in range(12,988)]
arrNum=[str(i).zfill(3) for i in range(12,988)]
## 경우의 수 중복 제거
for i in range(len(arrNum2)):
if len(arrNum2[i])>len(set(arrNum2[i])):
arrNum.remove(arrNum2[i])
ranNum = random.choice(arrNum) ## 정답 숫자
## 숫자 맞추기 시작
while True:
count+=1
comp = random.choice(arrNum) ## 컴퓨터가 맞추는 숫자
## STRIKE, BALL 초기화
strike = 0
ball = 0
## STRKIE & BALL 횟수 확인
for i in range(3):
if comp[i]==ranNum[i]:
strike+=1
elif comp[i] in ranNum:
ball+=1
## 3 STRKIE이거나 전체 남아있는 넘버가 1개면 종료
if strike == 3 or len(arrNum) == 1:
break
## 경우의 수 제거
for i in range(len(arrNum)-1, -1, -1):
## 자기자신 제거
if comp[0] == arrNum[i][0] and comp[1] == arrNum[i][1] and comp[2] == arrNum[i][2]:
del arrNum[i]
## STRKIE 수랑 BALL 수랑 같은거 제거
else:
## 전체 수가 들어있는 배열에 대한 스트라이크 & 볼 횟수
arr_strike=0
arr_ball=0
## 배열 안 스트라이크 & 볼 횟수 확인
for j in range(3):
if comp[j]==arrNum[i][j]:
arr_strike+=1
elif comp[j] in arrNum[i]:
arr_ball+=1
## 같으면 계속 진행 / 다르면 삭제
if strike==arr_strike and ball==arr_ball:
continue
else:
del arrNum[i]
## 평균 count 횟수 출력
print(count/allCount)
--> 1000번을 실행하여 평균 진행횟수를 계산해보았다.
보통 5.xx번 나온다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
문자열 순열 알고리즘 JAVA (0) | 2020.11.16 |
---|---|
C 가위바위보 게임 (0) | 2019.08.20 |
C 다이아몬드 ver.2 (0) | 2019.07.24 |
C# 로또번호 (2) | 2019.06.20 |
C# 다이아몬드 (5) | 2019.06.20 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday