1. A method of operating a data storage system comprising a controller including a buffer memory, and a non-volatile memory including a memory cell array of multi-level memory cells (MLC) divided into a first region and a second region, the method comprising: programming first MLC connected to a first word line in the second region by: receiving first data in the buffer memory and programming the first data to the first region using a buffer program operation, and receiving second data in the buffer memory and programming the second data to the first region using the buffer program operation; and programming the first MLC with the first data and the second data stored in the first region using a main program operation; then, programming second MLC connected to a second word line in the second region using the main program operation; and then, reprogramming the first MLC by: receiving third data in the buffer memory and programming the third data to the first region using the buffer program operation; and reprogramming the first MLC with the first data, the second data, and the third data stored in the first region using the main program operation, wherein respective threshold voltage distributions for the first MLC are narrowed between the programming and the reprogramming of the first MLC.