💻 프로그래머스 : 이상한 문자 만들기 - 문제 링크
import Foundation
func solution(_ s:String) -> String {
var sarr : [String] = s.split(separator: " ").compactMap{String($0)}
for i in 0..<sarr.count {
sarr[i] = sol2(sarr[i])
}
return sarr.joined(separator: " ")
}
func sol2(_ ss: String) -> String {
var ssarr = Array(ss)
for i in 0..<ssarr.count {
if i % 2 == 0 {
ssarr[i] = Character(ssarr[i].uppercased())
} else {
ssarr[i] = Character(ssarr[i].lowercased())
}
}
return String(ssarr)
}
도대체 왜 안되나 싶어서 반례를 찾아보니까 문자간 공백이 많으면 그대로 유지가 되어야 한다고. 문제를 읽고 거기까진 생각을 못해서 고려를 안 하고 코드를 짰는데, 저걸 본 후 코드를 다시 짜야한다는 생각에 열받아서 이마를 탁...
왜 저렇게 사소한 부분까지 집착하나 싶기도 하다가, 현실 프로그래밍 할때는 저런 예외 요소들까지 모두 고려해야 버그 없는 코드를 짤 수 있으니 미리 다양한 예외케이스를 학습해두는 것은 오히려 좋다는 마음가짐으로 다시 짰다.
import Foundation
func solution(_ s:String) -> String {
let copys = Array(s)
var newarr : [String] = []
var count = 0
for i in copys {
if count % 2 == 0 {
newarr.append(i.uppercased())
} else {
newarr.append(i.lowercased())
}
count += 1
if i == " " { count = 0 }
}
return newarr.joined()
}
" "를 만나면 유지하되 count가 초기화되는 방식의 풀이.
다른 사람의 풀이에서 기존에 내가 쓰고 싶었던 느낌의 코드가 있길래 가져왔다.
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.map { $0 }.joined() }.joined(separator: " ")
}
내 처음 코드와 메커니즘 자체는 비슷한 것 같은데,
이건 왜 공백이 유지되는가 했더니 split()과 components()의 차이였다.
이하는 이에 대한 GPT의 설명
split(separator:)
와components(separatedBy:)
의 차이
split(separator:)
:
- 기본적으로 결과에서 빈 문자열을 제거합니다. 연속된 구분자(예: 공백) 사이에 아무 문자도 없는 경우, 그 결과는 무시됩니다.
- 예를 들어,
"hello world".split(separator: ' ')
를 실행하면["hello", "world"]
만 반환되며, 중간의 공백은 무시됩니다.
components(separatedBy:)
:
- 이 메서드는 구분자 사이에 아무 것도 없는 경우에도 빈 문자열을 결과에 포함시킵니다.
"hello world".components(separatedBy: " ")
를 실행하면["hello", "", "", "world"]
가 반환됩니다. 즉, 공백 문자열도 배열의 요소로 포함되어 반환됩니다.
알고리즘 공부 열심히 하시고 계시네요~ 사전캠프 잘 하고 계신가요?