문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 사항
s는 길이 1 이상 200 이하인 문자열입니다.
s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
숫자는 단어의 첫 문자로만 나옵니다.
숫자로만 이루어진 단어는 없습니다.
공백문자가 연속해서 나올 수 있습니다.
1차 고민
이건 C언어로도 해봤던 문제라서 방법이 생각날듯말듯 했다.
무조건 스플릿이다. 그리고 기존에 알던 uppercased()와 lowercased()를 잘 쓰면 풀리지 않을까 싶다.
1차 코드
func solution(_ s:String) -> String {
var splitArr = s.split(separator: " ")
var result = ""
for i in splitArr {
if let firstChar = i.first, firstChar.isLetter {
result += firstChar.uppercased() + i.dropFirst()
} else {
result += i
}
result += " "
}
return result
}
1차 결과
2차 고민
하나도 빠짐없이 다 틀렸다는 건 코드 진행 방향이 잘못되었거나 , 결과 리턴을 잘못주었거나, 필수 조건이 구현되지 않았을 때가 많았다.
코드 진행 방향은 일단 내 머릿 속에서는 맞았다.
결과도 내가 원하는 result라는 String을 리턴하고 있어서 문제되지 않는다.
그렇다고 Capltalize가 잘못된거같지는 않았다. 소문자면 대문자로 변환이 잘 이루어지기 때문에.
그래서 예제에 있는 코드를 가지고 플레이그라운드에서 돌려봤다.
예제 입력 : "3people unFollowed me"
정답 출력 : "3people Unfollowed Me"
나의 출력 : "3people UnFollowed me"
그렇다. 필수 구현 조건이 빠진게 맞았다.
" 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. "
문제의 첫 문장이었는데 까먹고 구현안한게 말이 안되는 것 같다.
이런 걸 보면 가끔 나는 내 강력하게 각인되어버린 사고가 두 눈과 귀를 막는 느낌을 받는다.
제대로 읽지않고 "아 캐피털라이징" 하고 코드 구현하다가 정작 캐피털라이징도 제대로 구현하지 못했다.
잡설은 각설하고 나머지 문자열 혹은 else에 lowercased()만 붙이면 될 것 같다.
2차 코드
func solution(_ s:String) -> String {
var splitArr = s.split(separator: " ")
var result = ""
for i in splitArr {
if let firstChar = i.first, firstChar.isLetter {
result += firstChar.uppercased() + i.dropFirst().lowercased()
} else {
result += i.lowercased()
}
result += " "
}
return result
}
2차 결과
3차 고민
그렇게 되었다. 도대체 뭐가 문제인지 몰랐는데 같이 공부하는 스터디원 분께서 오류를 찾아주셨다.
문자열을 생성하고 맨 뒤에 공백이 한 칸 들어간다는 것이었다.
그리고나서 다시 보니까 공백이 두 번 연속으로 등장할 수도 있다고 하더라.
그럼 split으로는 공백의 연속됨을 잡아낼 수 없다는 생각에 components(separatedBy:)를 사용하기로 했다.
5차 고민
3차와 4차 시도에 대한 코드와 결과를 화면으로 남기지 못했다. 그래서 3차 다음 바로 5차 고민이다.
3차에서는 components(separatedBy:)를 활용하는 것으로 바꾸었더니 실패했고,
4차에서는 capitalized()를 사용했으나 실패했다.
capitalized()는 숫자 바로 뒤에 오는 문자가 대문자로 바뀌어버리는 문제가 생긴다.
문자의 맨 앞글자를 대문자로 바꾸는 고차함수라서 어떻게 손 쓸 방법이 없다고 생각하여
C언어 시절에 하던 그대로 직접 조건을 다 주어서 숫자가 앞인 경우에는 uppercased를 제외하기로 했다.
5차 코드
func solution(_ s:String) -> String {
var bool = true
var result = ""
for i in s {
if i == " " {
result += " "
bool = true
continue
}
if bool {
if let temp = Int(String(i)) {
result += String(i)
} else {
result += String(i).uppercased()
}
bool = false
} else {
result += String(i).lowercased()
}
}
return result
}
5차 결과
느낀 점
사실 문제를 처음 열었을 때부터 import Foundation 이라든가
import UIKit이 없었던 것을 이상하게 생각했어야했다.
그게 없어도 풀린다는 뜻 아니었나싶다.
굳이 넣어서 고차함수적으로 풀어보려하니 사고가 났던 것 같다.
애초에 capitalized()의 변형 함수를 구현해보라는거여서 저걸로는 못풀지않았을까 싶다.
역시 하드코딩 최고다!
'iOS > Programmers' 카테고리의 다른 글
[Swift] lv.2 올바른 괄호 | Programmers (0) | 2024.03.25 |
---|---|
[Swift] lv.2 최솟값 만들기 | Programmers (1) | 2024.03.22 |
[Swift] lv.1 직사각형 별찍기 | Programmers (0) | 2024.03.20 |
[Swift] lv.2 최댓값과 최솟값 | Programmers (0) | 2024.03.19 |
[Swift] lv.1 행렬의 덧셈 | Programmers (0) | 2024.03.18 |