본문 바로가기
Algorithm/스택&큐&덱&힙

[프로그래머스] PCCP 모의고사 1회 3번 유전법칙

by HANNI하니 2023. 12. 14.

사용 언어 - Python3

문제 - 유전법칙

https://school.programmers.co.kr/learn/courses/15008/lessons/121685

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

정답

규칙찾기! 스택 활용

모든 부모들로 거슬러 올라가서 그 부모가 몇 번째 자식이었는지 확인

 

(내 풀이)

해당 부모의 몇번째 자식인지 확인

(p-1)를 4로 나누면, 몫 = 몇번째 세대 / 나머지 = 몇번째 자식인지 확인

 

1. 인덱스를 맞춰주기 위해 p -= 1

2. n == 1 세대이면, 그냥 return 'Rr'

3. while n > 1: # 2세대 이상인 경우 모든 세대를 올라가면서 확인해준다.

stack.append(p%4) = 4로 나눈 나머지 = 부모의 몇번째 자식인가 = 0,1,2,3번째 자식 중 하나

n-=1 한 세대씩 올라가면서 확인

p = p//4 = 4로 나눈 몫 = 몇 번째 세대인가 = 0,1,2세대...

예 ) 

    # 3세대 8번째 =>  n = 3, p = 7
    # p%4 = 3, stack = [3], p = 1, n = 2 
    # p%4 = 1%4 = 1, stack = [3,1], p = 0, n = 1
    # num = 3, rr
    
    # 3세대 2번째 => n = 3, p = 1
    # p%4 = 1 stack = [1], p = 0, n = 2
    # p%4 = 0 stack = [1,0], p = 0, n = 1
    # num = 0, RR

 

4. stack에 중간에 한번이라도 0과 3이 나오면 = 부모들 중 한 부모라도 첫번째(RR)나 마지막 자식(rr)이었다면

= 그 자식들도 항상 RR,rr이다

 

5. 나머지는 모두 'Rr'

 

6. return [*map(함수명,함수에 들어가는 리스트)]

 

def get_gene(pose):
    n,p = pose
    stack = []
    
    p -= 1 # 1번째 개체, 인덱스 0부터 시작
    
    while n > 1: # 1세대면 그냥 'Rr'
        # 모든 부모 세대들의 몇 번째 자식이었는지를 모두 저장
        stack.append(p%4) # 나머지 = 부모의 몇번째 자식인지 0,1,2,3
        
        n -= 1 # 1세대, 인덱스 0부터 시작
        p //= 4 # 몫 = 몇번째 세대인지 0,1,2...
        
    while len(stack) > 0:
        num = stack.pop()
        # 중간에 한번이라도 RR,rr이 나오면 해당 형질 리턴
        if num == 0: return 'RR' # 부모의 첫번째 자식
        if num == 3: return 'rr' # 부모의 마지막 자식

    return 'Rr'
    
def solution(queries):
    return [*map(get_gene, queries)]

 

 

 

레퍼런스

 

[프로그래머스] PCCP 모의고사 - 유전법칙

문제 : PCCP 모의고사 - 유전법칙 바로가기 문제 설명 멘델은 완두콩을 이용하여 7년간 실험한 결과, 다음과 같은 특별한 법칙을 발견하였습니다. 둥근 완두 순종(RR)을 자가 수분, 즉 같은 유전자

programming4myself.tistory.com

 

 

댓글