[프로그래머스] 이상한 문자 만들기

neoneoneo·2024년 3월 5일
0

kotlin

목록 보기
20/49
post-custom-banner

문제

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

나의 풀이

class Solution {
    fun solution(s: String): String {
        var answer = ""
        var wordRoom = ""        
        for (i in 0..s.lastIndex) {             
            wordRoom += s[i] //한 캐릭터씩 넣다가            
            if (s[i] == ' ' || i == s.lastIndex) { //캐릭터가 공백이거나 마지막 캐릭터라면             
                for (j in 0..wordRoom.lastIndex) { //저장된 wordRoom에서
                    if (j % 2 != 0) { //홀-소, 짝-대 넣기
                        answer += wordRoom[j].toLowerCase()
                    } else answer += wordRoom[j].toUpperCase()
                }
                wordRoom = "" //임시 변수 초기화하기
            }        
        }
        return answer
    }
}
  • s에 한 캐릭터씩 접근한다. 그러다가 공백이 나오면 하나의 단어라고 판단하고, 홀/짝수 판별을 하여 소/대문자 처리를 한다.
  • 마지막 단어일 경우 공백이 아니라 마지막 캐릭터일 경우로 조건을 두어(i == s.lastIndex) 마지막 단어까지 처리한다.

고수의 풀이

class Solution {
    fun solution(s: String) =
        s.split(" ").joinToString(" ") { word ->
            word
                .mapIndexed { index, char -> 
                    if (index % 2 == 0) char.toUpperCase() else char.toLowerCase()
                }
                .joinToString("")
        }
}
  • s.split(" ") : 먼저 공백을 기준으로 단어를 나눈다.
  • joinToString(" ") { word -> ... } : 나누어진 부분 문자열에 대해 작업을 수행하고, 그 결과를 공백을 기준으로 연결한다.
  • word.mapIndexed { index, char -> ... } : word에 들어가 있는 각 문자에 대해 람다 함수를 적용한다.
    • index : 문자 인텍스(0, 1, 2 ...)
    • char : 문자(t, r, y...)
  • 그 이후 홀/짝수에 따라 소/대문자 처리를 한 뒤 joinToString("")을 사용하여 빈 문자열 기준으로 합쳐 단어를 만든다.

배운점과 느낀점

  • 고수의 코드를 처음 봤을 때에는 공백이 여러 개일 경우에도 정상적으로 처리하는 게 맞는걸까? 의심이 되었다(코드 돌려보고 바로 의심을 접었지만). 마침 내가 공부하고 싶은 map을 이용한 좋은 사례를 보게 되어 기뻤고, mapIndexed 뿐만 아니라 split을 통해 공백 단위로 문자를 뽑아내어 리스트에 저장한다는 부분을 배우게 되었다.
  • 이번 코드를 보면서 느낀점은 내게 코드를 보고 해석하는 능력은 어느 정도 있지만, 정작 저 코드에 사용된 split, manIndexed를 사용할 줄은 모른다는 것이다. 문제를 계속해서 for, if문으로만 풀어내고 있는데, 조금 더 고급(?) 스킬을 사용해보고 싶다.

[TIL-240305]

post-custom-banner

0개의 댓글