SRM 183, D2, 550-Pointer (BridgeSort)
James S. Plank
Tue Feb 28 16:59:28 EST 2017
This is a sorting problem. Unfortunately, though, you have to somehow turn "cards" into
something on which you can sort. Here are three approaches that you can take. I took
the first of these when I solved the problem, but they are all valid solutions.
Solution #1: Convert Cards to Integers and Use a Map
My first step was to turn the string into a vector of
two-character strings, so that I could simply focus on these. I used the substr() method
to do this. For example the first string:
"HAH2H3C4D5ST" -- becomes -- { "HA", "H2", "H3", "C4", "D5", "ST" }.
Next, I took each string in the vector, and turned it into an integer.
I used two helper strings for this:
string suit = "CDHS";
string rank = "23456789TJQKA";
|
I used the find() method of these strings to convert each card's suit into a number between 0
and 3, and each card's rank into a number between 0 and 12.
I then multiplied the suit by 13 and added
the rank. For example, the two of clubs is 0, the three of clubs is 1, and the two of diamonds is
13.
Next, I used a map whose keys were integers and whose vals were strings, and I inserted the
integer/card into the map. At the end, I traversed the map and created the return string.
Solution #2: Enumerate the possible cards in order
Because the number of possible cards is so small (52), you can simply enumerate the cards in
order, and then test to see if each card is in the string. To do this, I used the same two
helper strings above, and then a doubly-nested for loop to create each card. I
created each card as a string, and then used the find() method of strings to see
if the card was in the original string. If so, I added the card to the return string.
As you can see, this solution requires no map and no sorting. It may not be the most efficient
in the world, but the constraints of the problem are so small that it doesn't matter.
Solution #3: Convert the cards to integers, sort the integers, and convert back
This solution is similar to the first one, but you don't need to create a vector of strings
or a map. Instead, you can traverse the input string two characters at a time, converting
each pair of characters to an integer. Push each integer onto a vector, and then sort the
vector. Then, traverse the vector, and convert each integer back to a suit character and
a rank character, and add them to the return string.