[프로그래머스] 키패드 누르기(C++)
in CodingTest
#include <string>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
float Distance(int x1, int y1, int x2, int y2) {
float result=sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
return ceil(result);
}
string solution(vector<int> numbers, string hand) {
string answer = "";
int left = 10;
int right = 12;
map<int, pair<int, int>> tempMap;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tempMap.insert(pair<int, pair<int, int>>(i * 3 + (j+1), pair<int, int>(j, 3-i)));
}
}
tempMap.insert(pair<int, pair<int, int>>(10, pair<int, int>(0, 0)));
tempMap.insert(pair<int, pair<int, int>>(0, pair<int, int>(1, 0)));
tempMap.insert(pair<int, pair<int, int>>(12, pair<int, int>(2, 0)));
for (vector<int>::size_type i = 0; i < numbers.size(); i++)
{
if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7)
{
answer += "L";
left = numbers[i];
}
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] ==9)
{
answer += "R";
right = numbers[i];
}
else if (numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8 || numbers[i] == 0)
{
if (Distance(tempMap[left].first, tempMap[left].second, tempMap[numbers[i]].first,tempMap[numbers[i]].second) > Distance(tempMap[right].first, tempMap[right].second, tempMap[numbers[i]].first, tempMap[numbers[i]].second)) {
answer += "R";
right = numbers[i];
}
else if (Distance(tempMap[left].first, tempMap[left].second, tempMap[numbers[i]].first, tempMap[numbers[i]].second) < Distance(tempMap[right].first, tempMap[right].second, tempMap[numbers[i]].first, tempMap[numbers[i]].second)) {
answer += "L";
left = numbers[i];
}
else if (Distance(tempMap[left].first, tempMap[left].second, tempMap[numbers[i]].first, tempMap[numbers[i]].second) == Distance(tempMap[right].first, tempMap[right].second, tempMap[numbers[i]].first, tempMap[numbers[i]].second)) {
if (hand == "right") {
answer += "R";
right = numbers[i];
}
else if (hand=="left") {
answer += "L";
left = numbers[i];
}
}
}
}
return answer;
}
실력이 부족한 탓에 코드가 지저분하다. 하지만 그래도 풀었다는 것에 의미를 둔다. 이 문제에서 중요했던 점은 양 손의 엄지 손가랃의 초기위치, 그리고 대각선 이동은 되지 않는 것 이 2개를 캐치하고 어떻게 구현할 것인가를 생각해야한다.
우선 map컨테이너로 각 키패드에 해당하는 숫자를 key값으로 넣고 그 키패드에 해당하는 좌표를 value로 넣어준다.
그리고 현재 왼손 엄지와 다음으로 이동 할 숫자와의 거리, 현재 오른손 엄지와 다음으로 이동 할 숫자와의 거리를 계산한다. 여기서 가장 중요한점이 대각선 이동은 안되기 때문에 Distance함수는 피타고라스 정의를 이용했기 때문에 대각선의 값이 나오는데 그 값을 올림 함수인 ceil()함수를 사용하여 상하좌우로 이동 한 것처럼 구현한다. 오늘 문제를 풀며 깨달은 점은 문제를 제대로 읽는 것이 얼마나 중요한지 알게 되었다.