문제
한창 생물학 공부 중이던 민서는 유전 파트 문제를 풀다가 머리에 쥐가 나버렸다.
그걸 지켜보던 '똑똑한' 상신이는 마음이 안쓰러워 대신 풀어줄 수 있는 간단한 프로그램을 작성하려고 한다.
다인자 유전이란 하나의 형질에 여러 대립 유전자가 관여하여 복합적으로 작용하여 하나의 형질에 관여하는 것이다.
아버지의 유전자와 어머니의 유전자를 입력 받고, 태어날 수 있는 아이가 다인자 유전을 통해 우성 유전자를 몇 개 가질 수 있는지, 밝은 피부 또는 어두운 피부로 태어날 확률은 얼마나 되는지 확률을 구해주자.
+ 아버지와 어머니는 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 |
---|