본문 바로가기

Anything Programming

[Python] 내 아이가 다른 인종은 아닐거야 ..

문제

한창 생물학 공부 중이던 민서는 유전 파트 문제를 풀다가 머리에 쥐가 나버렸다.

 

그걸 지켜보던 '똑똑한' 상신이는 마음이 안쓰러워 대신 풀어줄 수 있는 간단한 프로그램을 작성하려고 한다. 

 

다인자 유전이란 하나의 형질에 여러 대립 유전자가 관여하여 복합적으로 작용하여 하나의 형질에 관여하는 것이다.

 

아버지의 유전자와 어머니의 유전자를 입력 받고, 태어날 수 있는 아이가 다인자 유전을 통해 우성 유전자를 몇 개 가질 수 있는지, 밝은 피부 또는 어두운 피부로 태어날 확률은 얼마나 되는지 확률을 구해주자.

 

+ 아버지와 어머니는 3쌍의 유전자를 갖고 있다.

 


예제 입출력


코드

import sys
input = sys.stdin.readline

def cnt_upper(arr):
    cnt = 0
    for ch in arr:
        if ch.isupper():
            cnt += 1
    return cnt

dic = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0}
# key값으로 우성 유전자의 개수, value값으로 key개의 우성 유전자를 가진 유전자 개수를 갖는 디렉토리
    
print("아버지의 유전자를 입력하세요: ", end = '')
dad = list(input().rstrip())

print("어머니의 유전자를 입력하세요: ", end = '')
mom = list(input().rstrip())

dad_a = dad[0:2]
dad_b = dad[2:4]
dad_c = dad[4:6]

mom_a = mom[0:2]
mom_b = mom[2:4]
mom_c = mom[4:6]

kid = []

for da in dad_a:
    kid.append(da)
    for ma in mom_a:
        kid.append(ma)
        for db in dad_b:
            kid.append(db)
            for mb in mom_b:
                kid.append(mb)
                for dc in dad_c:
                    kid.append(dc)
                    for mc in mom_c:
                        kid.append(mc)
                        dic[cnt_upper(kid)] += 1
                        kid.pop()
                    kid.pop()
                kid.pop()
            kid.pop()
        kid.pop()
    kid.pop()

print()

for i in range(7):
    print(f"우성 유전자를 {i}개 가질 확률은 약 {(dic[i] / 64 * 100):0.3f}% 입니다.")
    # 확률의 소수점 3자리까지 출력

print()
print(f"밝은 피부로 태어날 확률은 약{((dic[0] + dic[1] + dic[2]) / 64 * 100): 0.3f}% 입니다.")
print(f"어두운 피부로 태어날 확률은 약{((dic[4] + dic[5] + dic[6]) / 64 * 100): 0.3f}% 입니다.")

 


코드 설명

1. key개의 우성 유전자 개수를 갖는 유전자가 몇 개 존재하는지 저장할 디렉토리를 생성한다.

 

2. 입력 받은 아버지 유전자 dad와 어머니 유전자 mom을 세 구간으로 나눠 다시 저장한다.

 

3. 각 구간에서 알파벳을 하나씩 뽑아 완성된 아이의 유전자 안에 우성 유전자 개수를 디렉토리에 저장한다.

+ 우성 유전자 개수는 리스트안에 대문자 개수를 반환하는 함수 cnt_upper를 이용한다.

+ 아이의 유전자를 스택으로 생각하고 하나씩 넣고 완성되었다면 넣은 유전자를 하나씩 빼준다.

 

4. 우성 유전자 i개 가질 확률과 밝은 피부, 어두운 피부로 태어날 확률을 출력한다.

'Anything Programming' 카테고리의 다른 글

[Python] 암달의 법칙 실습 문제 계산하기  (4) 2023.09.10