코딩 테스트/프로그래머스

[Swift] 프로그래머스(lv.1) 27 - 이상한 문자 만들기

말차프라푸치노 2022. 3. 6. 15:08

이상한 문자 만들기

문제 설명

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


제한 사항

  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

입출력 예

"try hello world" ->  "TrY HeLlO WoRlD"

 

문제 풀이

  1. 입력으로 들어온 문자열을 components(separatedBy: " ")를 사용해 공백에 따라 나누어준다. ["try", "hello", "world"] 로 나누어져있다.
  2. 배열의 항목을 for-in 루프를 사용해 돈다.
  3. 문자열을 for-in 루프와 String.index를 사용해 접근한다. index가 짝수이면 uppercased()를 통해 대문자로 만들고, 홀수이면 lowercased()를 통해 소문자로 만든다.
  4. 문자열 사이사이에 공백을 추가해준다. 이 때 if문을 사용해 마지막 문자에는 공백을 추가하지 않는다.

 

 

코드

func solution(_ s:String) -> String {
       
    let s_separated = s.components(separatedBy: " ")
    var result = ""
    
    for i in 0..<s_separated.count {
        let arr = s_separated[i]
        for j in 0..<arr.count{
            if(j % 2 == 0){
                result += arr[arr.index(arr.startIndex, offsetBy: j)].uppercased()
            } else {
                result += arr[arr.index(arr.startIndex, offsetBy: j)].lowercased()
            }
        }
        if (i != s_separated.count - 1){
            result += " "
        }
    }

    return result
}

 

 

다른 사람들의 코드

import Foundation
func solution(_ s:String) -> String {
    let a = s.components(separatedBy: " ").map { $0.enumerated().map { $0.offset % 2 == 0 ? $0.element.uppercased() : $0.element.lowercased() } }
    return a.map{ $0.joined() }.joined(separator: " ")
}

enumerated를 사용해 문자열을 offset과 element로 분류했다.

a를 출력해보면 [["T", "r", "Y"], ["H", "e", "L", "l", "O"], ["W", "o", "R", "l", "D"]] 가 나온다.

a를 joined()를 사용해 두번 합쳐 주었다.

처음에는 그냥 합치고 그 다음에는 separator를 사용해 단어 사이에 공백을 추가해주었다.

 

 

후기

문자열을 나누어서 수정할 때 배열로 나눈다.

이때 배열안에서 문자열로 사용할지 아님 문자열을 배열로 바꿔서 사용할지는 조금 더 공부해야지 기준이 설 것 같다.

다만 내가 작성한 코드처럼 예외 문이 있는 코드는 썩 좋아보이지 않는다.