본문 바로가기
Kotlin/Exercise

RNA를 DNA로 바꾸기

by 봄석 2019. 3. 3.

RNA를 DNA로 바꾸기


DNA 가닥이 주어지면 RNA 보체를 돌려줍니다

DNA와 RNA 가닥은 모두 핵산 염기 서열입니다.

DNA에서 발견되는 4 개의 뉴클레오타이드는 아데닌 ( A ), 시토신 ( C), 구아닌 ( G ) 및 티민 ( T )입니다.

RNA에서 발견되는 4 개의 뉴클레오티드는 아데닌 ( A ), 시토신 ( C ), 구아닌 ( G ) 및 우라실 ( U )입니다.

DNA 가닥이 주어지면, 전사 된 RNA 가닥은 각 뉴클레오타이드를 보체로 대체하여 형성됩니다 :

  • G -> C
  • C -> G
  • T -> A
  • A -> U



TestCode

class RnaTranscriptionTest {
 
    @Test
    fun cytosineComplementIsGuanine() {
        assertEquals("G", transcribeToRna("C"))
    }
 
    @Test
    fun guanineComplementIsCytosine() {
        assertEquals("C", transcribeToRna("G"))
    }
 
    @Test
    fun thymineComplementIsAdenine() {
        assertEquals("A", transcribeToRna("T"))
    }
 
    @Test
    fun adenineComplementIsUracil() {
        assertEquals("U", transcribeToRna("A"))
    }
 
    @Test
    fun rnaTranscription() {
        assertEquals("UGCACCAGAAUU", transcribeToRna("ACGTGGTCTTAA"))
    }
 
}


해결안 1) stringBuilder

 private fun transcribeToRna(dna: String)= buildString {
        dna.iterator().forEach {
            if(it.toString()=="C") append("G")
            if(it.toString()=="G") append("C")
            if(it.toString()=="T") append("A")
            if(it.toString()=="A") append("U")
        }
    }



stringBuilder에 조건마다 스트링을 추가합니다.


해결안 2) map, when , joinTostring

 private fun transcribeToRna(dna: String): String = dna.map {
        when (it) {
            'G' -> 'C'
            'C' -> 'G'
            'T' -> 'A'
            'A' -> 'U'
            else -> it
        }

    }.joinToString(separator = "")



1) String.map 함수(리턴값 list)로 각인덱스의 char를 when에 넣어줍니다. 

2) when 안에서 DNA를 RNA로 바꿔주고 , 나머지는 들어온값 그대로 보냅니다.

3) joinToString 함수를 이용하여 list를 String으로 변환합니다.


해결안 3) map, when , joinTostring

 val dnaToRna = mapOf('C' to 'G''G' to 'C''T' to 'A''A' to 'U')

 fun transcribeToRna(input: String): String = input.map { dnaToRna[it] }.joinToString(separator = "")


1)  map을 정의합니다 

2)  String.map{}으로 각 인덱스의 char를 map함수의 key로 넣어주고 , value값을 list로 리턴합니다.

3) joinToString으로 list를 String으로 변환합니다.


해결안 4) fold 함수

   fun trans(nucleotide: Char) =
        when (nucleotide) {
            'G' -> 'C'
            'C' -> 'G'
            'T' -> 'A'
            else -> 'U'
        }
 
    fun transcribeToRna(dna: String=

        dna.fold("") { rna, nucleotide -> rna + trans(nucleotide.toUpperCase()) }

1) String.fold(초기화할값){ R,T -> R}을 호출합니다. 초기화할 값으로 ""을 넣어주고 , 리턴할 값은 rna, 받는값 T(nucleotide)는 dna 입니다 .

2) trans 함수에 T를 대문자로 넣어주고, 그 리턴값을 계속하여 rna에 더합니다



String.map 

inline fun <R> CharSequence.map(
    transform: (Char) -> R
): List<R>

지정된 변환 함수를 원의 char 순서의 각 문자에 적용한 결과를 포함한리스트를 돌려줍니다 .


joinToString 


- joinToString 함수 원형

fun CharArray.joinToString(
    separator: CharSequence = ", "
    prefix: CharSequence = ""
    postfix: CharSequence = ""
    limit: Int = -1
    truncated: CharSequence = "..."
    transform: (Char) -> CharSequence = null
): String


- Array(ByteArray,CharArray,IntArray,DoubleArray..등) 나 반복자(Iterator)에서 쓸수 있습니다.

  • 컬렉션의 원소 사이에 구분자(Separator)를 추가하고, 접두사(Prefix)와 접미사(Postfix)를 추가 할 수 있습니다.
  • 콜렉션이 커질 수있는 경우, 음수가 아닌 limit 값을 지정할 수 있습니다 .이 경우 첫 번째 제한 요소  추가되고 잘린 문자열 (기본값은 "...")이 뒤에옵니다 . (truncated)

- joinToString Example


val numbers = listOf(123456)
println(numbers.joinToString()) // 1, 2, 3, 4, 5, 6
 
println(numbers.joinToString(prefix = "[", postfix = "]")) // [1, 2, 3, 4, 5, 6]
 
println(numbers.joinToString(prefix = "<", postfix = ">", separator = "•")) // <1•2•3•4•5•6>
 
 
 
val chars = charArrayOf('a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q')
 

println(chars.joinToString(limit = 5, truncated = "...!") { it.toUpperCase().toString() }) // A, B, C, D, E, ...!


참고 1  joinToString -http://tech.javacafe.io/2018/10/14/%EC%BD%94%ED%8B%80%EB%A6%B0%EC%8A%A4%ED%84%B0%EB%94%94_3%EC%9E%A5_%EC%A0%95%EB%A6%AC/


참고 2 kotlin 공식문서 joinToString - https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/join-to-string.html



String.fold(initial:R){R,T->R} 함수

fold 함수의 원형

inline fun <TR> Sequence<T>.fold(
    initial: R
    operation: (acc: R, T) -> R
)R

적산 값으로 시작 초기 값 및인가 동작을 전류 누산기 값 및 각 소자에 왼쪽에서 오른쪽으로한다. 

즉 누산기 같은 역할입니다. RxJava의 reduce와 비슷합니다 . 값을 계속 더해줄수 있습니다 .

fold는 겹이라는 뜻입니다.





'Kotlin > Exercise' 카테고리의 다른 글

우주 시대 - 행나이를 주었을때, 나이를 초로 바꾸어보기  (2) 2019.03.09
10억초 더하기  (2) 2019.03.03
Twofer - 스트링 리턴하기  (2) 2019.03.03
윤년 찾기  (4) 2019.03.03
Hamming -DNA 차이  (2) 2019.03.03

댓글