본문 바로가기
Kotlin/Exercise

어구를 약어로 변경하기

by 봄석 2019. 3. 14.

어구를 약어로 변경하기 

어구를 약어로 변경해보도록 하겠습니다. 

예를들어 Portable Network Graphics 라면  PNG로 줄일수있게됩니다 . 



TestCode


@Test
    fun fromTitleCasedPhrases() {
        val phrase = "Portable Network Graphics"
        val expected = "PNG"
        assertEquals(expected, Acronym.generate(phrase))
    }
 
    @Test
    fun fromOtherTitleCasedPhrases() {
        val phrase = "Ruby on Rails"
        val expected = "ROR"
        assertEquals(expected, Acronym.generate(phrase))
    }
 
    @Test
    fun fromPhrasesWithPunctuation() {
        val phrase = "First In, First Out"
        val expected = "FIFO"
        assertEquals(expected, Acronym.generate(phrase))
    }
 
    @Test
    fun fromNonAcronymAllCapsWord() {
        val phrase = "GNU Image Manipulation Program"
        val expected = "GIMP"
        assertEquals(expected, Acronym.generate(phrase))
    }
 
    @Test
    fun fromPhrasesWithPunctuationAndSentenceCasing() {
        val phrase = "Complementary metal-oxide semiconductor"
        val expected = "CMOS"
        assertEquals(expected, Acronym.generate(phrase))
    }
 
    @Test
    fun fromVeryLongAbbreviation() {
        val phrase = "Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me"
        val expected = "ROTFLSHTMDCOALM"
        assertEquals(expected, Acronym.generate(phrase))
    }
 
    @Test
    fun fromConsecutiveDelimiters() {
        val phrase = "Something - I made up from thin air"
        val expected = "SIMUFTA"
        assertEquals(expected, Acronym.generate(phrase))
    }



해결안 1 ) buildString

  object Acronym {
        fun generate(input: String= buildString {
                input.split("-"," ")
                    .listIterator()
                    .forEach {
                        if (it != "")
                            append(it[0].toUpperCase())
                    }
        }
    }


1) intput을 split()으로 나눕니다 . "-"와 ""으로 나눈 값은 리스트형식으로 리턴됩니다.

ex) Portable Network Graphics이라면 [Portable,Network,Graphics]

 "Something - I made up from thin air"는  [Something, , , I, made, up, from, thin, air]처럼 리턴됩니다.

2 ) listIterator().forEach{}를 통해 각 인덱스를 리턴합니다.

Portable Nework Graphics 가 리턴됩니다.

3)  if문으로 ""이 아닌것만 걸러내고 String의 첫번째 인덱스만 얻어와 대문자로 바꾸어 buildString에 추가합니다.



해결안 2 ) split, filterNot, map, joinToString

fun generate(input: String=
            input.split(" ","-")
                .filterNot{ it.isEmpty() }
                .map { it.first().toUpperCase() }

                .joinToString("")


1) 마찬가지로 intput을 split()으로 나눕니다 . "-"와 ""으로 나눈 값은 리스트형식으로 리턴됩니다.

2) filterNot{} 을 통해 list내용중에서 Empty가 아닌것들만 걸러줍니다

3) map을 list의 각 인덱스의 String을 가져오고,  String.first()로 첫번째값을 가져와 대문자로 변경합니다. 

리턴값은 리스트입니다.

4) 리턴된 리스트를 JoinToString으로 이어줍니다. 구분은 ""로 연결합니다.

댓글