Kotlin

Kotlin 공부 - 예제, 연습 - #7. 알파벳 숫자 세기

자다르 2022. 4. 16. 17:46

※ 인프런 강의: 개복치개발자님의 [입문편] 안드로이드를 위한 코틀린(Kotlin) 문법 강의 내 예제이며, solution #1은 제가 작성한 코드이고, soultion-#2는 강의 예제에서 제시한 코드입니다.


 

  • solution - #1 - List를 Map으로 변환, Map의 정렬을 위한 List로의 변경, List가 복수 요소일 때의 정렬
// 문자의 갯수를 세는 solution을 만들어주세요
// 문자열이 많이 나온 순서대로 정렬됩니다.
// 문자열 갯수가 같은 경우는 없다고 가정합니다. (a 는 5개 b 는 5개 이런 경우는 없습니다.)

fun main(){

    val result1 = solution("aabbaabccbb")
    println(result1)
    // {b=5, a=4, c=2}

    val result2 = solution("ccddcddaaq")
    println(result2)
    // {d=4, c=3, a=2, q=1}

}

fun solution( str : String ): Map<String, Int> {
	
    // 문자열을 각 문자별로 나눠 각 갯수를 구하기 위해 사용하는 임시 리스트
    var temp_list = mutableListOf<String>()
    
    // 각 문자별 갯수를 저장하는 임시 리스트
    var temp_list_distinct = listOf<String>()
    
    // 문자별 갯수를 저장하는 맵
    var resultMap = mutableMapOf<String, Int>()
    var count = 0
    
    println("입력 문자열:"+str)
    
    // 문자열을 각 문자로 이루어진 리스트에 저장
    for(i in 0..str.length-1){
        temp_list.add(str[i].toString())
    }
    println("문자열 내 각 문자를 리스트로: "+ temp_list)
    
    // Unique한 문자만 뽑아내기
    temp_list_distinct = temp_list.distinct()
    
    // 전체 리스트에서 unique한 문자의 각 갯수 구하기
    for( unique_char in temp_list_distinct ){
        count = temp_list.count{ it == unique_char }
        resultMap[unique_char] = count
    }
    
    println("각 문자별 갯수:"+resultMap)
    
    /*
    전체 리스트에서 unique한 문자의 갯수 구하는 다른 방법 - 이중 for 사용
    for( i in temp_list_distinct ){
        count = 0
        for( j in temp_list ){
            if( i == j ){
                count++
            }
            resultMap[i] = count
        }
    }
    */
    
    // 많이 나온 문자&갯수의 조합을 갯수를 기준으로 내림차순 정렬위해 map을 List로 변환
    val temp_maplist : List< Pair<String, Int> > = resultMap.toList()
    println("map을 List로 변환: "+temp_maplist)
    //println(temp_maplist::class.java.simpleName)
    
    // 정렬하기 위해 mutableList로 변환
    val temp_mutableMaplist = temp_maplist.toMutableList()
    //println(temp_mutableMaplist)
    //println(temp_mutableMaplist::class.java.simpleName)
    
    // 갯수(리스트 내 두 번째 요소)를 기준으로 내림차순 정렬
    temp_mutableMaplist.sortByDescending { it.second }
    println("List를 갯수를 기준으로 내림차순 정렬: "+temp_mutableMaplist)
    
    val resultOrderedMap = temp_mutableMaplist.toMap().toMutableMap()
    
    return resultOrderedMap
}

결과
=========================
입력 문자열:aabbaabccbb
문자열 내 각 문자를 리스트로: [a, a, b, b, a, a, b, c, c, b, b]
각 문자별 갯수:{a=4, b=5, c=2}
map을 List로 변환: [(a, 4), (b, 5), (c, 2)]
List를 갯수를 기준으로 내림차순 정렬: [(b, 5), (a, 4), (c, 2)]
{b=5, a=4, c=2}
입력 문자열:ccddcddaaq
문자열 내 각 문자를 리스트로: [c, c, d, d, c, d, d, a, a, q]
각 문자별 갯수:{c=3, d=4, a=2, q=1}
map을 List로 변환: [(c, 3), (d, 4), (a, 2), (q, 1)]
List를 갯수를 기준으로 내림차순 정렬: [(d, 4), (c, 3), (a, 2), (q, 1)]
{d=4, c=3, a=2, q=1}
  • solution - #2. Unique한 각 문자의 리스트 및 각 문자의 갯수 리스트를 만든 후 두 개를 합쳐 map으로 만든 후, 정렬하는 방법
// 문자의 갯수를 세는 solution을 만들어주세요
// 문자열이 많이 나온 순서대로 정렬됩니다.
// 문자열 갯수가 같은 경우는 없다고 가정합니다. (a 는 5개 b 는 5개 이런 경우는 없습니다.)

fun main(){

    val result1 = solution("aabbaabccbb")
    println(result1)
    // {b=5, a=4, c=2}

    val result2 = solution("ccddcddaaq")
    println(result2)
    // {d=4, c=3, a=2, q=1}

}


fun solution( str : String ): Map<String, Int> {

    // 일단은 문자열에 어떤 알파벳이 있는지 찾기

    val resultArr = mutableListOf<String>()

    for(i in str) {
        resultArr.add(i.toString())
    }

    //println(resultArr)
    //println(resultArr.distinct())

    val distinctList = resultArr.distinct()
    val countList =  mutableListOf<Int>()
    // 어떤 알파벳이 몇번 사용되었는지 세기


    for (i in distinctList){ // a b c
        val count = resultArr.filter { it == i}.count()
        // println(count)
        countList.add(count)
    }


    // 알파벳이 많이 나온 순서대로 정렬

    val resultMap = mutableMapOf<String, Int>()

    for (i in 0..distinctList.count() - 1){
        //println(distinctList[i])
        //println(countList[i])
        resultMap[distinctList[i]] = countList[i]
    }

    // println(resultMap.toList().sortedBy {it.second}.reversed().toMap() )

    return resultMap.toList().sortedBy {it.second}.reversed().toMap()

}

결과
===========================
{b=5, a=4, c=2}
{d=4, c=3, a=2, q=1}