어구를 약어로 변경하기
어구를 약어로 변경해보도록 하겠습니다.
예를들어 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으로 이어줍니다. 구분은 ""로 연결합니다.
댓글