TIL/알고리즘

02/13 알고리즘 공부(41) - 이상한 문자 만들기

sos000303 2024. 2. 13. 15:58
728x90

조건

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.( 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다, 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.)

알고리즘 예상

  1. count를 이용해 알파벳이 짝수번째인지, 홀수번째인지를 확인한다.
  2. 짝수번째이면 대문자로, 홀수번째이면 소문자로 answer에 넣고 count를 1 늘린다.
  3. 확인하는 원소가 ' '(공백)이면 answer에 추가한 후 count를 0으로 초기화한다.

초기 코드

class Solution {
    fun solution(s: String): String {
        var answer = ""
        return answer
    }
}

 

내 코드

class Solution {
    fun solution(s: String): String {
        var answer = ""
        var count = 0
        
        for(i in s.toCharArray()){
            when{
                i == ' ' -> {
                    answer += i
                    count = 0
                }
                count%2 == 0 ->{
                    answer += i.toUpperCase()
                    count ++
                }
                else -> {
                    answer += i.toLowerCase()
                    count++
                }
            }
        }
        return answer
    }
}

' '를 기준으로 여러개의 문자열로 나누어 forEach나 map을 이용하는 방법도 있을 것 같다.

 

다른 사람의 풀이

class Solution {
    fun solution(s: String) =
        s.split(" ").joinToString(" ") { word ->
            word
                .mapIndexed { index, char -> 
                    if (index % 2 == 0) char.toUpperCase() else char.toLowerCase()
                }
                .joinToString("")
        }
}

 

개선점 또는 배운점

  1. ' '을 기준으로 여러개의 문자열로 나누는 방법이 나왔다. split을 이용하면 기준점을 이용해 여러개의 문자열로 나눌 수 있고 joinToString을 이용해 나누어진 문자열 별로 mapIndexed를 이용해 콜렉션을 만든 뒤 joinToString을 통해 문자열로 바꾸어주는 방법이다. 

 

개선된 코드

class Solution {
    fun solution(s: String): String {
        var answer = ""
        answer = s.split(" ").joinToString(" ") {
            s -> s.mapIndexed { index, c -> if(index%2 == 0) c.toUpperCase() else c.toLowerCase() }.joinToString("")
        }
        return answer
    }
}
728x90