If you want to improve your problem solving skills, I'd suggest solving actual problems. Data structures and algorithms can be very satisfying in their own right, but the real value is in taking a real-world problem and translating it into code.
It also depends what you want to do with your knowledge. There are domains that are deeply technical and require a lot of the things you've mentioned, but they also tend to be pretty hard to break into. A lot of software is not so deep. Any software project will have need for good domain modeling, architecture, and maintainability. Again, these are things best learned through practice.