In order to prove NP-Completeness we show 2 things, first being that the problem is in NP, and second
being that an arbitrary problem in NP can be reduced to this problem.
In order to prove NP-Hardness we choose an arbitrary NP-complete problem (ie SAT) and then show that it can be reduced via polynomial reduction to our problem in polynomial time.
P is the class of decision problems which can be solved in polynomial time
NP is the class of problems which can be verified in polynomial time NP-hard is the class of decision problems to which all problems in NP can be reduced to in polynomial time NP-complete is the class of decision problems in NP to which all problems in NP can be reduced to in polynomial time