코딩테스트

프로그래머스 | 이상한 문자 만들기 | Kotlin | 다시풀기

다시은 2024. 1. 18. 10:20

 

 

Kotlin 대/소문자 변환

toUpperCase / toLowerCase

 

내 풀이 => 실패

class Solution {
    fun solution(s: String): String {
        var answer = ""
        
        s.mapIndexed{ 
            i, n -> if( i%2 ==0 || i ==0 ) answer += n.toUpperCase() else answer += n.toLowerCase() 
        }
        
        return answer
    }
}

 

 

 

문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.

 

이게 문제인 것 같은데

문자열 전체로 본 인덱스가 아니고 "try hello world" 면 "try" 에서의 짝/홀수, "hello"에서의 짝/홀수?

 

 

힌트

 

 

.split(" ")

 

"try", " hello", " world" 로 나누어졌다.

공백도 따로 나누어져야지 짝/홀수 구분할 수 있는거 아닌가

어쨌든 저대로 for문에 돌려보니까 공백은 인식하지 못한 채로 문자열로 합쳐진다.

변환은 됐는데 공백을 어떻게 되돌리지

 

 

내 풀이 2 => 실패

class Solution {
    fun solution(s: String): String {
        var answer = ""
        var s = s.split(" ")
        for((i, ss) in s.withIndex()) {
            for((j, sss) in ss.withIndex()) {
                if(j ==0 || j %2 ==0) {
                    answer += sss.toUpperCase()
                } else {
                    answer += sss.toLowerCase()
                }
            }
            answer +=" "
        }
        return answer
    }
}

 

 

제일 끝에 공백이 한 번 더 들어갔다.

생략된 for문을 채워넣을 때 나뉘어진 각 문자열을 돌고 난 뒤 한 번씩 더해준게 마지막에도 더 더해줘서 그런 것 같다.

마지막 문자는 어떻게 빼지?

maxIndex 를 구해서 제거해줘야되나?

 

내 풀이 3

class Solution {
    fun solution(s: String): String {
        var answer = ""
        var s = s.split(" ")
        for((i, ss) in s.withIndex()) {
            for((j, sss) in ss.withIndex()) {
                if(j ==0 || j %2 ==0) {
                    answer += sss.toUpperCase()
                } else {
                    answer += sss.toLowerCase()
                }
            }
            if(i != s.size-1 ) answer +=" "
        }
        return answer
    }
}

 

마지막 인덱스 돌 때는 공백을 더해주지 않았다.

실행 시간이 어마무시하게 오래 걸렸다 🤯🤯🤯🤯

 

 

다른 사람 풀이

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

 

봐도 모르겠다....

joinToString 은 컬렉션을 지정된 문자를 각각에 넣어서 문자열로 만드는거 아닌가? split 한 의미가뭐지,,,

 

 

 


레벨이 높아지니까 너무 막힌다.

다른 순서로 바꿔봐야겠다.

 

 

먼소린지 모르겠지만 알고리즘 이건 무작정 푸는게 아닌 것 같다 어떤 함수를 써라 라고 까지 했는데 이걸 어떻게 넣어야할지 모르겠는걸 😒 해야할게 계속 늘어나네