It probably wouldn't make that big a difference to switch rows into columns, it was more or less a "desperate" advice.
If you only have around 400 bytes for level data I doubt you can do anything magically to have that many levels, the compression won't kick in until you have a larger chunk of level data with patterns which it could recognize.
As you know which symbols you are using (a limited set) and roughly how often they occur you could try using a Huffman encoding. As it is a symbol encoding scheme the main goal is to encode each symbol with as few bits as possible (as in morse code), you might know this already but now it's said anyway.
If you tried that you might use a Huffman encoding scheme set like:
And write the entire level down as a long binary string, with 11111111 terminating said string, you would end up with: (line breaks there for clarity, one line per line in your map (not the row->columns switched one.)
This gives us 800 bits under something pretty close to optimal symbol encoding (it would have been optimal if the encoding scheme would have been based on statistical data from your levels, which you could hard code as it will make for a higher compression in this case).
The above level could be stored in 80 bytes, but it will vary depending on the symbol frequency in each level. This data will get some additional compression from the LZW algorithm if it had a larger chunk of level data, but as you only have 400 bytes to play with I guess you are out of luck.
Anyway, it's still a nice game! Even if it only has a few levels, I guess your best bet is to optimize your code instead of level data. If you succeed in that and get more space for your level data, then your level data will hopefully be compressed better as well.