치료 솔루션을 개발하는 생명공학 회사에서 일하고 있어요.
팀은 방금 희귀암을 위한 표적 치료제를 개발하는 새 프로젝트를 맡았어요.
이야기가 아주 복잡하지만, 기본 아이디어는 이래요. 때로는 우리 몸에서 특정 단백질을 너무 많이 만들어요. 그러면 온갖 문제가 생길 수 있어요.
그런데 아주 특정한 분자(마이크로 RNA라고 불러요)를 만들 수 있다면, 그 단백질이 만들어지는 것을 막을 수 있어요.
이 기법을 RNA 간섭이라고 해요.
주어진 DNA 서열의 RNA 상보 가닥을 알아내는 것이 이번 과제예요.
DNA와 RNA 가닥은 모두 뉴클레오타이드가 이어진 서열이에요.
DNA에 있는 네 가지 뉴클레오타이드는 아데닌(A), 사이토신(C), 구아닌(G), 티민(T)이에요.
RNA에 있는 네 가지 뉴클레오타이드는 아데닌(A), 사이토신(C), 구아닌(G), 우라실(U)이에요.
DNA 가닥이 주어지면, 각 뉴클레오타이드를 상보적인 뉴클레오타이드로 바꿔서 전사된 RNA 가닥을 만들어요.
G -> C
C -> G
T -> A
A -> U
입력과 출력이 어떻게 구성되어 있는지 보고 싶다면, 테스트 스위트의 예제를 살펴봐요.
Option이나 Result를 반환하는 공개 new 함수와 함께 구조체의 비공개 필드를 사용하면(여기서 DNA::new와 RNA::new가 그렇죠), DNA의 내부 표현이 올바르다는 것을 보장할 수 있어요. 유효한 DNA 문자열에는 항상 유효한 RNA 문자열이 대응하므로, into_rna에서 Result나 Option을 반환할 필요가 없어요.
테스트에서 보게 될 타입 시그니처는 바로 이 때문이에요.
DNA::new()와 RNA::new()의 반환 타입은 모두 Result<Self, usize>이고, 여기서 오류 타입 usize는 처음으로 잘못된 문자의 인덱스(문자 인덱스이며, utf8이 아니에요)를 나타내요.