멘델은 완두콩을 이용하여 7년간 실험한 결과, 다음과 같은 특별한 법칙을 발견하였습니다.
- 둥근 완두 순종(RR)을 자가 수분, 즉 같은 유전자끼리 교배할 경우, 다음 세대에 둥근 완두 순종 형질만 나타난다.
- 주름진 완두 순종(rr)을 자가 수분할 경우, 다음 세대에 주름진 완두 순종 형질만 나타난다.
- 두 순종을 교배한 잡종(Rr)을 자가 수분할 경우, 다음 세대의 형질은 RR:Rr:rr=1:2:1의 비율로 나타난다. (아래 그림 참조)
멘델의 법칙을 공부한 진송이는, 직접 완두콩의 자가 수분 실험을 진행했습니다. 진송이의 실험에서 완두콩 한 개를 자가 수분한 결과는 다음과 같습니다.
- 각 완두콩은 자가 수분해서 정확히 4개의 완두콩 후손을 남긴다.
- 잡종 완두콩(Rr)은 자가 수분해서 첫째는 RR, 둘째와 셋째는 Rr, 넷째는 rr 형질의 후손을 남긴다.
- 순종 완두콩(RR, rr)은 자가 수분해서 자신과 같은 형질의 후손을 남긴다.
잡종 완두콩(Rr) 1대부터 시작한 가계도로 그려보면 그림 2와 같습니다.
진송이는 이러한 완두콩의 자가 수분 실험 결과를 정리하고 싶어합니다. 하지만, 세대를 거듭할수록, 완두콩의 수가 너무 많아져 모든 가계도를 기록하기 어려워졌습니다. 진송이는 가계도를 전부 기록하는 것 대신, 완두콩의 세대와 해당 세대에서 몇 번째 개체인지를 알면 형질을 바로 계산하는 프로그램을 만들려 합니다.
각 세대에서 맨 왼쪽 개체부터 첫 번째, 두 번째, 세 번째, ...개체로 나타냅니다. 예를 들어 그림 2에서 2세대의 네 번째 개체의 형질은 "rr"이며, 3세대의 9번째 개체의 형질은 "RR"입니다.
형질을 알고 싶은 완두콩의 세대를 나타내는 정수 n과, 해당 완두콩이 세대 내에서 몇 번째 개체인지를 나타내는 정수 p가 2차원 정수 배열 queries의 원소로 주어집니다. queries에 담긴 순서대로 n세대의 p 번째 개체의 형질을 문자열 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ queries의 길이(쿼리의 개수) ≤ 5
- queries의 원소는 [n, p] 형태입니다.
- 1 ≤ n ≤ 16
- 1 ≤ p ≤ 4n-1
프로그래머스 파이썬 유전 법칙 121685 PCCP 모의고사 1회 3번
📌 문제 풀이
- 부모가 RR 혹은 rr이라면, 자식은 모두 RR이거나 rr이다.
- 따라서, 형질을 알고 싶은 완두콩의 부모가 RR인지, Rr인지, rr인지를 판별해야 한다.
- 완두콩 번호를 4로 나눈 나머지에 따라서 부모로부터 몇 번째 자식에 해당하는지를 파악할 수 있다.
- 1, 2, 3, 0 순으로 파악 가능.
예를 들어 3세대의 1부터 4번째 완두콩은 첫 번째 완두콩, 5부터 8번째 완두콩은 두 번째 완두콩이다.
- [3, 1 ~ 4] 의 부모 : [2, 1]
- [3, 5 ~ 8] 의 부모 : [2, 2]
- [3, 9 ~ 12] 의 부모 : [2, 3]
- [3, 13 ~ 16] 의 부모 : [2, 4]
전 세대에서 몇 번째 자식이 부모에 해당하는 지를 구하는 식은 다음과 같다.
(형질을 알고 싶은 완두콩 번호) - 1 // 4 에다가 1을 더해주면 된다.
1부터 4라는 숫자가 어떻게 굴려져서 모두 1이 나오게 하는 방법은 일단 4로 나누어보았을 때, 4의 경우 1이 나오기 때문에, 1을 빼준 후, 4로 나누면 모든 값이 0이 나올 수 있게 된다. 그 후, 번호는 1부터 시작이므로 1을 더해주었다.
부모가 전 세대에서는 몇 번째에 해당하는 지를 알아내는 것이 중요했던 문제이다.
부모의 세대를 알아냈다면, 자식의 형질도 4로 나눈 나머지를 통해 간단하게 구해낼 수 있게 된다.
✅ [ CODE ]
def bean(generation, order):
if generation == 1: return "Rr"
parent = bean(generation - 1, (order - 1) // 4 + 1)
if parent == "RR" or parent == "rr": return parent
if order % 4 == 0:
return "rr"
elif order % 4 == 1:
return "RR"
else:
return "Rr"
def solution(queries):
answer = []
for query in queries:
answer.append(bean(query[0], query[1]))
return answer