본문 바로가기
스터디(programmers)

Kotlin] 프로그래머스 lv.1, 이상한 문자 만들기

by 김마리님 2023. 1. 4.

https://school.programmers.co.kr/learn/courses/30/lessons/12930?language=kotlin 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

더보기

풀이

 

해당 문제의 핵심은 홀/짝이 중요한데, 공백을 만나면 이 홀/짝의 index가 리셋된다는 점이다.

초기에는 공백을 기준으로 단어를 split해서 넣을까 했는데, 그렇게 되면 for문이 두 번 돌게 되서 지저분해질 것 같아서..

전역변수에 int를 지정해서 공백을 만날때마다 리셋을 시키는 방향으로 코드를 짰다.

(지금 생각해보면 realIndex를 1로 지정했으면 될 것을 굳이 왜 시작지점을 0으로 지정했는지 나도 날 모르겠긴 한데) 초기값을 0으로 지정하고, 나머지가 0이면 홀수째에 오는 문자로 판단하고 대문자로 변경하고, 나머지가 1이면 짝수번째에 오는 문자로 판단하고 소문자로 변경한다. 문자열을 인덱스를 집어 직접적으로 변환할 수 없기 때문에 빈 StringBulider에 넣어서 append 한다.

 

class Solution {
    fun solution(s: String): String {
        var realIndex = 0
        var stringBuilder = StringBuilder()

        for(element in s) {
            if(element != ' ') {
                if(realIndex % 2 == 0) {
                    stringBuilder.append(element.uppercase())
                } else {
                    stringBuilder.append(element.lowercase())
                }
                realIndex += 1
            } else {
                stringBuilder.append(element)
                realIndex = 0
            }
        }

        return stringBuilder.toString()
    }
}

 

 

++)

코틀린 개발을 하지만 코틀린에 대해 가끔 잊는게,, 코틀린은 list에 대한 매서드가 어마무시하게 많다는 점이다.

자바 개발도 같이 해서 그런가 자바를 처음 배워서 그런가 자꾸 자바처럼 개발을 하는데.. 

다른 사람의 답을 보다가 천재적인 답을 발견함. 물론 이걸 돌려보지 않아서 효율성에서 어떨진 모르겠는데..

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

 s를 먼저 split해서 배열화 하고, 이 배열화 된 값을 다시 joinToString을 통해 배열값에 " "  붙여 다시 문자열을 만든다.

{} 내부에는 약간 swift의 completion같은 느낌으로.. 해당 괄호 내에서 처리된 단어들을 붙여준다.

예시로 나온 "try hello world" 를 넣었다 가정하자.

따라서, word는 [try, hello, world]로 된다.

이 각각의 배열 요소 속 word들은 mapIndexed를 통해 단어를 char의 배열로 다시 변환한다.

이 변환에서 인덱스에 따라 대소문자를 구분하여 넣게 된다. 이 char 배열들을 다시 joinToString을 통해 공백 없이 붙이고, 이걸 word에 대응한 것이다.

코틀린적 처리 너무 멋있는데.. 근데 이거도 결국 반복문 두 번 도는거랑 차이가 없지 않나 (흠)

하지만 알고리즘 풀이에서 문자를 공백으로 떼고 문자들만 변환하고 이딴게 너무 많아서 joinToString이랑 mapIndexed는 다른 풀이에서도 유용하게 쓸 것 같다. 짱!

 

 

 

반응형