왜 이 편을 가장 먼저 다루는가
이 시리즈의 목표는 "실무 바이오인포매티션이 매일 만지는 알고리즘을 손과 코드로 이해하기"입니다. 그러려면 우리가 다룰 대상, 즉 DNA · RNA · 단백질이 컴퓨터의 눈에 어떻게 보이는지부터 정리하고 가야 합니다. 이 편이 없으면 다음 M02(시퀀싱 3세대)부터 나올 "리드 100bp"라는 표현이 그저 숫자가 될 겁니다. 그런데 그 100bp는 사실 A · C · G · T 네 글자의 유한 알파벳 문자열이며, 시퀀싱 장비가 하는 일은 그 문자열을 오차와 함께 뱉어내는 것뿐입니다.
계산의 대상으로 삼기 위해 우리는 생물학의 가장 큰 아이디어 하나 — 센트럴 도그마 — 를 매우 얇게 뜯어봅시다. 그리고 그 뜯어본 결과를 Rosalind 첫 문제(DNA)의 5줄짜리 파이썬 풀이로 확인해봅시다.
알파벳이 네 글자밖에 없다는 사실이 왜 결정적인가
컴퓨터가 다루는 데이터는 대개 두 글자(0/1) 알파벳입니다. 자연어는 수만 글자짜리 유니코드입니다. DNA는 그 중간, 정확히 네 글자입니다. A (아데닌), C (사이토신), G (구아닌), T (티민). RNA는 T 대신 U (우라실)를 씁니다.
이 유한한 크기가 이후의 모든 것을 바꿉니다. 검색 · 압축 · 통계 · 색인 · 딥러닝 임베딩까지 전부 "네 글자짜리 알파벳에서 확률적으로 이런 패턴이 반복된다"는 사실 위에 서 있습니다. 예를 들어 시퀀스 30bp를 무작위로 뽑았을 때 같은 서열이 인간 게놈(3 × 10⁹ bp)에서 우연히 등장할 확률은 입니다. 시퀀싱 리드가 짧아도 특정 위치로 정렬(alignment)이 가능한 근본 이유입니다.
CS에서 유한 알파벳 위의 문자열 처리 문제는 오래 연구됐습니다. Rabin-Karp · KMP · Aho-Corasick · Suffix Array · FM-index. 이 모든 것이 이후 편에서 다시 나옵니다. 지금은 이 사실만 붙잡고 갑시다. DNA는 네 글자짜리 유한 알파벳 문자열입니다.
센트럴 도그마 — 세 문자열 사이의 결정적 변환
Francis Crick이 1958년에 정리한 문장은 이렇습니다. DNA → RNA → 단백질. 세 종류의 문자열이 있고, 그 사이에 방향성 있는 변환이 있습니다.
변환 1: 전사 (Transcription) — DNA → RNA
T가 U로 바뀝니다. 그리고 두 가닥 중 한 쪽만 읽습니다. 다른 세부(스플라이싱 등)를 잠시 접어두면, 이 변환은 문자열 치환 한 번에 지나지 않습니다.
def transcribe(dna: str) -> str: return dna.replace("T", "U")한 줄입니다. Rosalind RNA 문제가 이 함수 하나로 통과됩니다. 실무 파이프라인은 여기에 스플라이싱 · 5′ 캡 · 3′ 폴리A · 편집(RNA editing)을 더하지만, 뼈대는 문자열 치환입니다.
변환 2: 번역 (Translation) — RNA → 단백질
RNA 3글자(코돈, codon)가 아미노산 1글자로 매핑됩니다. 이게 그 유명한 유전 부호 표(genetic code table) 입니다. AUG가 시작 코돈(메티오닌), UAA · UAG · UGA가 종결 코돈. 그 사이의 코돈들은 각자 정해진 아미노산으로 갑니다.
즉 번역은 길이 3짜리 슬라이딩 윈도우로 RNA를 훑으면서 사전(dict)을 참조하는 문제입니다.
GENETIC_CODE = { "AUG": "M", "UAA": "*", "UAG": "*", "UGA": "*", "UUU": "F", "UUC": "F", "UUA": "L", "UUG": "L", "CUU": "L", "CUC": "L", "CUA": "L", "CUG": "L", # ... (총 64개 코돈)}
def translate(rna: str) -> str: protein = [] for i in range(0, len(rna) - 2, 3): aa = GENETIC_CODE.get(rna[i:i+3], "X") if aa == "*": break protein.append(aa) return "".join(protein)이게 Rosalind PROT의 뼈대입니다. 물론 실제 세포는 리보솜의 삼각 회전과 tRNA의 3D 결합으로 이걸 수행하지만, 계산의 관점에선 딕셔너리 조회 + 슬라이딩 윈도우입니다.
왜 코돈은 3글자인가
이 지점에서 잠깐 멈춰봅시다. 만약 코돈이 2글자였다면 조합밖에 안 됩니다. 아미노산이 20종인데 16으로는 부족합니다. 3글자면 조합, 20종의 아미노산을 세 배 넘게 커버합니다. 그래서 여분(redundancy) 이 생깁니다. 여러 코돈이 같은 아미노산을 코딩하는 이유입니다. 이건 코드 설계의 자연스러운 선택입니다. Reed-Solomon 오류정정 부호를 배웠다면 냄새가 익숙할 것입니다.
Rosalind DNA를 5줄로 풀어봅시다
Rosalind의 첫 문제 DNA — Counting DNA Nucleotides는 한 문장입니다. "DNA 문자열이 주어졌을 때 A, C, G, T 각각의 개수를 공백으로 구분해 출력하라."
def count_nucleotides(dna: str) -> str: return " ".join(str(dna.count(c)) for c in "ACGT")
# 예시sample = "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC"print(count_nucleotides(sample))# 20 12 17 215줄이 아니라 한 줄입니다. 이게 왜 그렇게 쉬운가 하면, 문제 자체가 유한 알파벳 위의 카운트로 환원되기 때문입니다. Rosalind에는 이 첫 문제부터 서서히 난이도가 올라가는 100+ 문제가 있고, 그중 많은 부분이 우리가 앞으로 배울 알고리즘(정렬, HMM, 어셈블리 등)의 축소판입니다.
Rosalind 계정을 아직 안 만들었다면 지금 하나 만들어두면 좋습니다. 매 편에서 손을 움직여야 하는 위치에 링크를 붙일 겁니다.
자주 만나는 실무 함정
- 대소문자 혼용: 시퀀싱 결과에는 소문자 (
acgt)로 반복 서열(low-complexity)을 표시한 것이 섞여 있습니다. 카운트할 때 반드시dna.upper()로 정규화합시다. - N 문자: 신뢰도가 낮은 위치를
N으로 표기합니다. 알파벳이 사실상 5글자입니다. 카운트 · 검색 · 정렬 모든 단계에서N을 어떻게 처리할지 정책을 정해야 합니다. - U와 T 혼용: DNA와 RNA를 같은 파이프라인에서 다룰 때 자주 실수합니다. FASTQ 리드는 DNA 알파벳, 어노테이션 GFF의 서열은 RNA일 수 있습니다. 파일 헤더를 반드시 확인합시다.
- 5′ 방향과 3′ 방향: 서열은 관례상 5′→3′로 씁니다. 반대 가닥은 역상보(reverse complement, M05에서 다룹니다)입니다. 방향을 놓치면 정렬이 통째로 뒤집힙니다.
CS 매핑
- 유한 알파벳 문자열: 정규표현식 · KMP · Aho-Corasick의 대상이 되는 자료 그 자체입니다.
- 결정적 변환: 전사(T→U)와 번역(3글자→아미노산)은 결정적 유한 오토마타(DFA) 로 해석할 수 있습니다. 상태가 없거나 단순한 상태 3개짜리 오토마타입니다.
- 컴파일러의 IR: DNA → RNA → 단백질 흐름은 컴파일러의 소스 → IR → 기계어 파이프라인과 구조적으로 닮았습니다. 각 단계는 다음 단계에 필요한 정보만 남기고 나머지를 버립니다.
- 여분(Redundancy): 코돈의 3글자 설계는 Reed-Solomon 같은 부호 설계에서 나오는 여분 개념과 정확히 같은 이유(오류 허용)로 존재합니다.
다음 편으로 이어지는 갈래
- 다음 편 (M02): 시퀀싱 3세대 — Sanger · NGS · 롱리드가 어떻게 문자열을 뽑아내는지, 그 결과가 왜 각자 다른 형태의 오류를 갖는지.
- 두 편 뒤 (M03): 해밍 거리 — 두 서열이 얼마나 다른가를 재는 가장 기본적인 수치. 진화 거리 통계의 시작.
- 세 편 뒤 (M04): GC 비율 — 알파벳 네 글자의 분포가 종을 얼마나 잘 판별하는가.
- 다섯 편 뒤 (M06): Needleman-Wunsch — 두 서열을 어떻게 최적으로 정렬하는가. 이미 파일럿으로 라이브인 편.
더 깊게 파고 싶다면
본문은 BPD가 자체 재구성한 서술입니다. 정통 강의로 심화하고 싶다면 아래를 순서대로 활용해봅시다.
- Harvard STAT115 — Xiaole Shirley Liu 교수의 Week 1: Molecular Biology Refresher (자막 완비, 자동 번역 우수). 센트럴 도그마를 통계학자 관점에서 다시 조립합니다.
- MIT 7.91J — Christopher Burge 교수의 Introduction to Computational and Systems Biology (자막 완비). 게놈 스케일에서 알파벳 통계가 왜 통하는지 조밀하게 유도합니다.
- 원 논문: Crick, F. (1970), Central Dogma of Molecular Biology, Nature 227, 561–563. 원문은 한 페이지 반짜리 짧은 편지입니다.
- 참고 무료 웹북: NCBI Bookshelf — Molecular Biology of the Cell. 교양 수준부터 실무 상세까지 오갑니다.
Rosalind에서 DNA · RNA · REVC · PROT 네 문제를 이어서 풀어봅시다. 다음 편 M02에서 만나는 시퀀싱 리드가 어디서 오는지가 자연스레 잡힙니다. 손을 움직여야 합니다.