https://rosalind.info/problems/iprb/
ROSALIND | Mendel's First Law
It appears that your browser has JavaScript disabled. Rosalind requires your browser to be JavaScript enabled. Mendel's First Law solved by 20688 2012년 12월 4일 7:02:24 오전 by Rosalind Team Topics: Heredity, Probability Introduction to Mendelian Inh
rosalind.info
이 문제는 맨델의 첫 번째 법칙, 우열법칙과 연관된 문제이다. 우성 동형 접합, 이형 접합, 열성 동형 접합의 개체수를 각각 띄어쓰기로 구분된 3개의 정수로 준다. 이러한 상황일 때 무작위적으로 교배를 시켰을 때 우성 인자를 가지고 있는(즉 우성형질을 띄는) 개체가 나올 확률이 몇 프로인지를 답으로 제출해야한다.
솔직히 처음에는 어떻게 해야할지 난감했다. 그러나 그냥 컴퓨터가 하는 일이니 무식하게 해버려도 되지 않을까 라고 생각하게 되었다. 편의상 우성 동형접합을 HH, 이형 접합을 Hh, 열성 동형집합을 hh라고 쓰겠다.
일단 교배의 경우를나누었다. 이 때 교배의 경우는 (HH,HH) , (HH,Hh) , (HH,hh) , (Hh,Hh) , (Hh,hh) , (hh,hh)의 6가지 경우가 나온다.
그 다음은 각 교배에서 나올 우성형질의 확률을 구한다. 게산의 편의를 위해 각각 교배에서 4개체가 나온다고 가정한다. (HH,HH)는 1, (HH,Hh)는 1, (HH,hh)는 1, (Hh,Hh)는 3/4, (Hh,hh)는 1/2, (hh,hh)는 0이다.
그 다음은 HH,Hh,hh의 개체수가 주어졌을 때 각 교배의 경우의 횟수를 구한다. 같은 군에서 서로 교배할 때는 개체수가 N이라 하면 N*(N-1)/2번 교배하게 되고, 다른 군끼리 교배할때는 개체수를 각각 N,M이라 하면 N*M번 교배하게 된다.
이제 교배의 경우의 횟수와 교배의 경우에서 우성형질의 확률을 곱해서 다 더하고 총 교배의 수로 나눠주면 된다.
이를 코드로 나타내면,
def itself(n): #같은 군에서
return n*(n-1)//2
def other(n,m):#다른 군에서
return n*m
HOMO,hetero,homo = map(int,input().split())
total=HOMO + hetero + homo
totalC = total*(total-1)//2 #총 경우의 수
totalH = (itself(HOMO)+itself(hetero)*3/4+itself(homo)*0 #같은 군끼리
+other(HOMO,hetero)+other(hetero,homo)*1/2+other(homo,HOMO))#다른 군끼리
print(totalH/totalC)#나눠서 확률
'문제해결(PS) > ROSALIND' 카테고리의 다른 글
Mortal Fibonacci Rabbits(수명이 있는 피보나치 토끼들) (0) | 2024.07.27 |
---|---|
Consensus and Profile(공통서열과 프로파일) (0) | 2024.07.26 |
Counting Point Mutations(점 돌연변이 세기) (0) | 2024.07.21 |
Computing GC Content (GC비율 계산하기) (0) | 2024.07.21 |
ROSALIND란? (1) | 2024.07.20 |