I'm a self-taught programmer.
I know algorithms, complexity theory, and lots of math: linear algebra, discrete maths, etc.
What does a good programmer need to know though? Fundamentals. Everything else is specialization. You'll need to know hardware, compilers, interpreters; abstractions, and a solid foundation in scientific principles. You need to be able to hypothesize, implement, test, and evaluate. A basic understanding of algorithms and complexity theory naturally comes into play when theorizing about computer problems which is why most courses integrate them into the curriculum. Beyond a very principled but fundamental understanding however, an in-depth and broad education in such subjects isn't necessary.
I taught myself a lot of maths because that's what interests me. I wanted to know how to write ray tracers, how to optimize them; how to use statistical analysis and discreet mathematics to sort through and find interesting facts about large sets of data. Do I need to know any of that to write a piece of software, compile it, and have it run efficiently? No. I learned that stuff for the kinds of programs I was writing.
The only real difference I find between myself and my university-trained colleagues is that I haven't suffered under the same financial burden as they for the knowledge I've acquired. Yet they talk about it like it's a serious advantage! Of course, there really isn't a serious difference between us that matters when the software ships. It's just a matter of perspective.
The stigma engendered to self-taught programmers however, is the hurdle I find most difficult to overcome and also easiest to ignore. Difficult because people assume things about you when you tell them that you learned on your own. Easy because once they realize that you are competent and capable, the stigma is removed. What many people don't seem to realize is that there are some great programmers out there who were self-taught. Just read through some of the interviews in "Coders at Work" by Peter Siebel. If the autodidacts among us are to be taken seriously, this generalization that self-taught programmers are backyard hacks has to stop. A bad programmer is a bad programmer whether they are self-taught or university taught.
After all, I could just turn around and generalize by saying that university trained programmers are privileged snobs who think "real-world" programming is beneath them. But that wouldn't be fair would it?
It takes all kinds and to each their own.
If you think you need to know something to solve the problem you're having, learn it. Move on.