<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DNA on Mulatta Blog</title><link>https://blog.mulatta.io/tags/dna/</link><description>Recent content in DNA on Mulatta Blog</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Tue, 30 Jan 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.mulatta.io/tags/dna/index.xml" rel="self" type="application/rss+xml"/><item><title>1C 역상보 문제</title><link>https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/</link><pubDate>Tue, 30 Jan 2024 00:00:00 +0000</pubDate><guid>https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/</guid><description>&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;h3 id="핵산의-방향성"&gt;핵산의 방향성
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;핵산(nucleic acid)&lt;/strong&gt;&lt;/em&gt; 는 &lt;strong&gt;인산-당-염기&lt;/strong&gt; 라는 하나의 단위가 &lt;em&gt;뉴클레오타이드(nucleotide)&lt;/em&gt; 를 이루며, 이러한 뉴클레오타이드가 여러 개 모여서 형성된 것이다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/nucleotide.png"
width="554"
height="420"
srcset="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/nucleotide_hu_6db368772e8e9044.png 480w, https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/nucleotide_hu_b410f82c633ee395.png 1024w"
loading="lazy"
alt="The Structure of the Nucleotide"
class="gallery-image"
data-flex-grow="131"
data-flex-basis="316px"
&gt;
&lt;em&gt;Fig 1. The Structure of the Nucleotide&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;즉, nucleotide는 &lt;strong&gt;당&lt;/strong&gt; 분자에 의해 인산과 염기가 연결된다. 이러한 당의 종류로 &lt;em&gt;&lt;strong&gt;Ribose 또는 Deoxyribose&lt;/strong&gt;&lt;/em&gt;가 있는데, 이들은 각각 RNA 또는 DNA의 nucleotide를 구성한다. 이 두 종류의 당은 5개의 탄소 원자로 구성되어 5탄당이라 하는데, 다음과 같이 각각의 탄소에 1번부터 5번까지의 번호를 매긴다. 두 당은 그 구조와 화학식이 서로 유사하지만, Ribose에는 2&amp;rsquo;의 위치에 hydroxyl group(2&amp;rsquo;-OH)이, Deoxyribose에는 2&amp;rsquo;의 위치에 hydrogen(2&amp;rsquo;-H)이 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/sugars_in_nucleotides.png"
width="584"
height="298"
srcset="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/sugars_in_nucleotides_hu_ff89437ddf639dda.png 480w, https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/sugars_in_nucleotides_hu_d7645483143115c2.png 1024w"
loading="lazy"
alt="The Types of Sugars in the RNA &amp; DNA"
class="gallery-image"
data-flex-grow="195"
data-flex-basis="470px"
&gt;
&lt;em&gt;Fig 2. The Types of Sugars in the RNA &amp;amp; DNA - Deoxyribose(left) and Ribose(right)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;따라서 &lt;strong&gt;핵산의 방향성&lt;/strong&gt;은 염기와 인산을 결합하는 당의 방향성에 의해 결정된다. 하나의 단일 뉴클레오타이드에서, 인산은 당의 5&amp;rsquo;에 위치한 탄소와 결합되며, 서로 다른 두 개의 뉴클레오타이드는 첫 번째 뉴클레오타이드 당의 3&amp;rsquo; 위치에서 다음 뉴클레오타이드 당의 5&amp;rsquo;에 결합된 인산과 공유결합&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;한다. 그러므로, 생물학에서 핵산의 방향성을 이야기 할 때, &lt;em&gt;&lt;strong&gt;&amp;ldquo;5&amp;rsquo; → 3&amp;rsquo;의 방향성을 가진다&amp;rdquo;&lt;/strong&gt;&lt;/em&gt; 고 말한다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/dna-single-strand.png"
width="1378"
height="1362"
srcset="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/dna-single-strand_hu_fcbb5d432c23885d.png 480w, https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/dna-single-strand_hu_e25e0c7fef1ff2f9.png 1024w"
loading="lazy"
alt="A single strand of DNA"
class="gallery-image"
data-flex-grow="101"
data-flex-basis="242px"
&gt;
&lt;em&gt;Fig 3. A single strand of DNA&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="핵산의-상보성"&gt;핵산의 상보성
&lt;/h3&gt;&lt;p&gt;한편, 핵산에서 염기는 일반적으로&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; 4종류의 염기를 가진다. DNA에서는 A, T, G, C를, RNA에서는 T 대신 U를 가진다. 이러한 4종류의 염기는 DNA나 RNA가 이중 가닥을 이룰 때 서로 &lt;em&gt;상보적으로&lt;/em&gt; 수소 결합한다. 즉, 4종류의 염기 중 2가지가 서로 짝을 이루어 수소결합을 하며, 이를 &lt;em&gt;&lt;strong&gt;상보적&lt;/strong&gt;&lt;/em&gt; 이라 한다.&lt;/p&gt;
&lt;p&gt;수소결합은 분자를 이루는 원자 중 전기음성도가 강하고 크기가 작은 F, O, N이 인접한 수소와 분자 간 쌍극자 힘에 의해 인력을 가지는 현상을 말한다. 염기에서는 아래의 그림과 같이 질소와 산소가 수소 결합을 할 만큼 충분히 존재하며, &lt;em&gt;&lt;!-- raw HTML omitted --&gt;여러 위치&lt;!-- raw HTML omitted --&gt;&lt;/em&gt; 에서 수소 결합이 일어날 수 있다.&lt;/p&gt;
&lt;p&gt;그 중 일반적인 경우에 형성되는 주요한 수소 결합을 Watson-Crick base-paring(Canonical base-paring)&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;이라 하며, A와 T(U)가 2개의 수소 결합을, G와 C가 3개의 수소 결합을 이룬다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/canonical_base_paring.png"
width="588"
height="934"
srcset="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/canonical_base_paring_hu_57349271c61c85fc.png 480w, https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/canonical_base_paring_hu_3f2c4fb73d80e3fb.png 1024w"
loading="lazy"
alt="Watson-Crick base-paring"
class="gallery-image"
data-flex-grow="62"
data-flex-basis="151px"
&gt;
&lt;em&gt;Fig 4. Watson-Crick base-paring&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="역상보-서열"&gt;역상보 서열
&lt;/h2&gt;&lt;p&gt;앞선 핵산의 방향성과 상보성을 고려하여, 역상보 서열이 무엇인지 알아보도록 하자.&lt;/p&gt;
&lt;p&gt;DNA가 이중 나선을 이룰 때, 상보성에 의해 각 가닥의 방향성이 정해진다. 즉, 어떤 한 가닥의 DNA가 이루는 방향이 5&amp;rsquo; → 3&amp;rsquo;으로 진행된다고 할 때, 또 다른 한 가닥의 DNA 역시 5&amp;rsquo; → 3&amp;rsquo; 의 방향성을 가진다. 이 두 가닥이 상보성에 의해 수소결합을 이루게 되면 다음의 그림과 같이 각 가닥이 서로 반대 방향으로 진행된다.&lt;/p&gt;
&lt;p&gt;그러므로, 우리는 어떤 임의의 서열을 읽을 때, &lt;em&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;기준 방향을 5&amp;rsquo; → 3&amp;rsquo;으로 정하고 그 서열을 읽는다.&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/reverse_complement.png"
width="700"
height="369"
srcset="https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/reverse_complement_hu_ad4e8703f5a0d696.png 480w, https://blog.mulatta.io/post/bioinformatics-algorithm/04-ch1-1c/reverse_complement_hu_5a557f34f9d9955.png 1024w"
loading="lazy"
alt="A complementary sequence that progresses in the reverse direction"
class="gallery-image"
data-flex-grow="189"
data-flex-basis="455px"
&gt;
&lt;em&gt;Fig 5. A complementary sequence that progresses in the reverse direction&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;한 가지 예시를 들어보자. 임의의 서열 &amp;ldquo;ACTGAT&amp;quot;가 있다고 할 때, 이 서열의 상보적인 서열은 &amp;ldquo;TGACTA&amp;rdquo; 가 된다. 그러나, 방향성을 고려하여 표시하면 다음과 같다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;5&amp;rsquo; - ACTGAT - 3'&lt;/p&gt;
&lt;p&gt;3&amp;rsquo; - TGACTA - 5'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;우리는 이 두 서열을 읽을 때, 주어진 5&amp;rsquo;→3&amp;rsquo;의 가닥을 &lt;em&gt;주형 가닥(template strand)&lt;/em&gt; 이라 하고, 그 반대편의 가닥을 &lt;em&gt;상보적인 가닥(complementary strand)&lt;/em&gt; 라 한다. 위 두 예시 서열을 기준 5&amp;rsquo; → 3&amp;rsquo;의 방향으로 읽으면, 다음과 같이 읽을 수 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;5&amp;rsquo; - ACTGAT - 3'&lt;/p&gt;
&lt;p&gt;5&amp;rsquo; - ATCAGT - 3'&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이때, 주어진 주형 가닥에 대해 5&amp;rsquo; → 3&amp;rsquo; 의 방향으로 읽은 상보적인 서열을 &lt;em&gt;&lt;strong&gt;&amp;ldquo;역상보 서열&amp;rdquo;&lt;/strong&gt;&lt;/em&gt; 이라 한다.&lt;/p&gt;
&lt;p&gt;따라서 이번 문제에서는 주어진 서열에 대한 역상보 서열을 찾아보도록 한다.&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Input: DNA 서열&lt;/li&gt;
&lt;li&gt;Output: 역상보 서열&lt;/li&gt;
&lt;li&gt;function: 주어진 DNA 서열에 대한 역상보 서열 찾기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pseudo-code"&gt;Pseudo-code
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ReverseComplement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;complement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;complement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;T&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;T&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;complement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;complement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;complement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;reverseComplement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;reverseComplement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;complement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;reverseComplement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="evaluation"&gt;Evaluation
&lt;/h2&gt;&lt;h3 id="time-complexity"&gt;Time Complexity
&lt;/h3&gt;&lt;p&gt;입력 크기: $\left\vert seq \right\vert = n$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;line[2]: 상보적인 서열을 저장할 변수 complement 초기화 → $O(1)$​&lt;/li&gt;
&lt;li&gt;line[4]: 주어진 입력 서열 seq의 모든 문자열(염기)를 순회 → $O(n)$&lt;/li&gt;
&lt;li&gt;line[5] ~ line[9]: 해당 순번의 염기 서열에 상응하는 상보적 서열을 complement에 저장 → $O(1)$&lt;/li&gt;
&lt;li&gt;line[11]: 역상보 서열을 저장할 빈 문자열 변수 reverseComplement 초기화 → $O(1)$&lt;/li&gt;
&lt;li&gt;line[13] ~ line[14]: 상보 서열의 모든 문자열을 순회하면서 뒤집어서 저장 → $O(n)$&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;모든 경우에 대해, 최악의 경우와 최선의 경우가 존재하지 않으며, 모든 문자열을 순회해야 correct solution이 도출됨.&lt;/li&gt;
&lt;li&gt;따라서, 다음 알고리즘은 항상 일정한 시간복잡도를 가지는 알고리즘임&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Total Time Complexity&lt;/strong&gt;&lt;/em&gt;: $O(1) + O(n) \times O(1) + O(1) + O(n) \approxeq O(n)$&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 주어진 서열을 상보적인 서열로 바꿔 반환하는 함수&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;Complement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 상보적인 서열이 어떤 것인지 저장하는 dictioinary 선언&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;basepair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;T&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;T&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 반환할 상보적 서열 문자열 변수 선언&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CompSeq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 입력 서열의 각 문자 하나씩에 대한 상보적인 문자를 추가함.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# A, T, G, C 가 아닌 다른 염기에 대한 상보적인 서열은 &amp;#39;?&amp;#39;로 추가&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CompSeq&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;basepair&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# reverse 매개변수를 참으로 받을 때 역상보 서열을 반환 (5&amp;#39; -&amp;gt; 3&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CompSeq&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 그렇지 않으면 상보 서열만 반환 (3&amp;#39; -&amp;gt; 5&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CompSeq&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://rosalind.info/problems/ba1c/" target="_blank" rel="noopener"
&gt;Rosalind&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/mulatta/Bioinforamtics-Algorithm-practice/blob/main/Chapter%201/ReverseComplement.py" target="_blank" rel="noopener"
&gt;Code in Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="discussion-points"&gt;Discussion Points
&lt;/h2&gt;&lt;h3 id="summary"&gt;Summary
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;임의의 DNA/RNA는 일반적인 경우 서로 &lt;em&gt;&lt;strong&gt;상보적&lt;/strong&gt;&lt;/em&gt; 인 서열을 가지고 있다.&lt;/li&gt;
&lt;li&gt;각 DNA/RNA는 &lt;em&gt;&lt;strong&gt;방향성&lt;/strong&gt;&lt;/em&gt;을 가지고 있으며, 생물학에서 이를 읽는 &lt;!-- raw HTML omitted --&gt;기준 방향을 5&amp;rsquo; → 3&amp;rsquo;&lt;!-- raw HTML omitted --&gt; 으로 한다.&lt;/li&gt;
&lt;li&gt;주어진 주형 가닥에 대한 상보적인 서열을 기준 방향으로 읽었을 때 &lt;em&gt;&lt;strong&gt;역상보 서열&lt;/strong&gt;&lt;/em&gt; 이라 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implementation-strategy"&gt;Implementation Strategy
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;주어진 서열의 상보적인 서열을 구한다.&lt;/li&gt;
&lt;li&gt;상보적인 서열을 반대 방향으로 읽는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="implications"&gt;Implications
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;책의 예시에서, &lt;em&gt;Vibrio cholerae&lt;/em&gt; 의 가장 빈번한 상위 4개 9-mer가 &amp;ldquo;ATGATCAAG&amp;rdquo;, &amp;ldquo;CTTGATCAT&amp;rdquo; 임&lt;/li&gt;
&lt;li&gt;이 두 서열은 서로 역상보 서열의 관계에 있으며, DnaA box를 구성할 것이라는 가설을 이끌 수 있음&lt;/li&gt;
&lt;li&gt;실제로 DnaA box에 결합하는 DnaA 단백질은 DNA의 주형 가닥에 결합할 지, 상보적 가닥에 결합할 지 구분하지 않음&lt;/li&gt;
&lt;li&gt;즉, 역상보 서열이 유전체에 존재하는 것은, 그 서열과 그 서열의 역상보 서열이 DnaA box를 구성할 것이라는 가설을 지지함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="reference"&gt;Reference
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Compeu, P., Pevzner, P. (2018). Bioinformatics Algorithms 3/e. 에이콘 출판사&lt;/li&gt;
&lt;li&gt;Craig, N., Cohen-Fix, O., Green, R., Greider, C., Storz, G., &amp;amp; Wolberger, C. (2010). Molecular biology: Principles of genome function. Oxford University Press.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;이러한 공유결합을 &lt;a class="link" href="https://en.wikipedia.org/wiki/Phosphodiester_bond" target="_blank" rel="noopener"
&gt;phospho-diester bond&lt;/a&gt;라 한다.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;일반적이지 않은 경우, chemical modificatioin이 일어난 기타 종류의 염기를 가진다. pseudo-uridine, m6A 등의 예시가 있다.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;앞선 각주 1에서 언급된 바와 같이, chemical modification이 일어난 염기나, 기타 DNA/RNA의 구조적 특징에 의해 새로운 수소 결합의 종류가 존재한다.(&lt;a class="link" href="https://en.wikipedia.org/wiki/Non-canonical_base_pairing" target="_blank" rel="noopener"
&gt;Non-canonical base-pairing&lt;/a&gt;)&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item></channel></rss>