Solution for Problem #12 (improved)