Problem
1 ~ n까지의 숫자 중
3의 배수이면 Fizz
5의 배수이면 Buzz
15의 배수이면 FizzBuzz
나머지는 해당 숫자
Input : Int
Output : String
Solution(kotlin 기준)
Solution 1
1234567891011121314151617181920212223
fun fizzBuzz(n: Int): String {
var result = ""
for(i in 1..n) {
var fizzBuzz = ""
if(i % 3 == 0) {
fizzBuzz += "fizz"
}
if(i % 5 == 0) {
fizzBuzz += "buzz"
}
if(fizzBuzz.isEmpty()) {
fizzBuzz = i.toString()
}
result += fizzBuzz + if(i != n) ", " else ""
}
return result
}
Solution 2
123456789
fun fizzBuzz(n: Int): String {
val fizz = { value: Int -> if(value % 3 == 0) "fizz" else "" }
val buzz = { value: Int -> if(value % 5 == 0) "buzz" else "" }
return (1..n).joinToString(", ") { i ->
val fizzBuzz = fizz(i) + buzz(i)
if(fizzBuzz.isEmpty()) i.toString() else fizzBuzz
}
}
Solution 3
123456789
fun fizzBuzz(n: Int): String {
val fizz = { value: Int -> if(value % 3 == 0) "fizz" else "" }
val buzz = { value: Int -> if(value % 5 == 0) "buzz" else "" }
val fizzBuzzOrNull = { value: String -> if(value.isNotEmpty()) value else null }
val print = { i: Int -> fizzBuzzOrNull(fizz(i) + buzz(i)) ?: i.toString() }
// val print = { i: Int -> { value: String -> if(value.isNotEmpty()) value else null}(fizz(i) + buzz(i)) ?: i.toString() } // fizzBuzzOrNull + print
return (1..n).joinToString(postfix = ", ", transform = print)
}
OR
123456789
fun fizzBuzz(n: Int): String {
val fizz = { value: Int -> if (value % 3 == 0) "fizz" else "" }
val buzz = { value: Int -> if (value % 5 == 0) "buzz" else "" }
val fizzBuzzOrValue = { value: Int ->
(fizz(value) + buzz(value)).takeIf { it.isNotEmpty() }?.run { this } ?: value.toString()
}
return (1..n).map(fizzBuzzOrValue).joinToString()
}
Solution3에서 더 방법이 있을 것 같은데 한계가 느껴지네요....
다른 코드로 푸시는 방법이 있으시면 댓글 남겨주세요! 댓글 하나가 저에겐 힘이 됩니다!!!
Idea by
Functional Programming이 뭔가요? - 송치원(곰튀김)