코딩 테스트/프로그래머스
[Swift] 프로그래머스(lv.1) 27 - 이상한 문자 만들기
말차프라푸치노
2022. 3. 6. 15:08
이상한 문자 만들기
문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
제한 사항
- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예
"try hello world" -> "TrY HeLlO WoRlD"
문제 풀이
- 입력으로 들어온 문자열을 components(separatedBy: " ")를 사용해 공백에 따라 나누어준다. ["try", "hello", "world"] 로 나누어져있다.
- 배열의 항목을 for-in 루프를 사용해 돈다.
- 문자열을 for-in 루프와 String.index를 사용해 접근한다. index가 짝수이면 uppercased()를 통해 대문자로 만들고, 홀수이면 lowercased()를 통해 소문자로 만든다.
- 문자열 사이사이에 공백을 추가해준다. 이 때 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를 사용해 단어 사이에 공백을 추가해주었다.
후기
문자열을 나누어서 수정할 때 배열로 나눈다.
이때 배열안에서 문자열로 사용할지 아님 문자열을 배열로 바꿔서 사용할지는 조금 더 공부해야지 기준이 설 것 같다.
다만 내가 작성한 코드처럼 예외 문이 있는 코드는 썩 좋아보이지 않는다.