오늘은 백준 10820번 문제를 풀었다. 문자열에서 소문자, 대문자, 숫자, 공백 개수 세기 문제를 해결했다.
초기에는 for 루프를 사용하여 각 문자를 검사했지만, 이를 더 Swift스럽게 작성하기 위해 reduce(into:)를 활용하는 방식으로 최적화했다.
🔹 기존 방식 (for 루프)
func countCharacters(in input: String) {
var lower = 0, upper = 0, number = 0, white = 0
for c in input {
if c.isLowercase { lower += 1 }
else if c.isUppercase { upper += 1 }
else if c.isNumber { number += 1 }
else if c.isWhitespace { white += 1 }
}
print("\(lower) \(upper) \(number) \(white)")
}
✅ 문제점:
• 여러 if-else 문이 가독성을 저하함
• 각 문자에 대해 여러 조건을 확인해야 하므로 성능 저하 가능
🔹 개선된 방식 (reduce(into:) 활용)
func countCharacters(in input: String) {
let counts = input.reduce(into: (lower: 0, upper: 0, number: 0, white: 0)) { result, c in
switch c {
case _ where c.isLowercase: result.lower += 1
case _ where c.isUppercase: result.upper += 1
case _ where c.isNumber: result.number += 1
case _ where c.isWhitespace: result.white += 1
default: break
}
}
print("\(counts.lower) \(counts.upper) \(counts.number) \(counts.white)")
}
✅ 개선된 점:
비교 항목 | reduce(::) | reduce(into:) |
---|---|---|
반환값 | 새로운 값 반환 | 기존 값을 수정 |
성능 | 새로운 값을 계속 생성 → 메모리 낭비 가능 | 기존 값을 변경하므로 성능 최적화 |
활용 예시 | array.reduce(0) { $0 + $1 } | array.reduce(into: &result) { $0 += $1 } |
🚀 reduce(into:)를 사용하면 불필요한 메모리 할당을 줄여 성능 최적화 가능!
📝 오늘의 회고
❓ 어떤 문제가 있었고, 나는 어떤 시도를 했는지?
🔍 어떻게 해결했는지?
🌟 무엇을 새롭게 알았는지?