거리값에 따라서 어떤 손꾸락으로 누를지를 결정하는 것이다.
고정되어 있는 값이므로 좌표를 사용하면 될것 같다고 판단함.
pair<int,int> 이런식으로 그리고 숫자 0,1,2,3,4,5,6,7,8,9 는
중복되는 값이 없으므로 mapping 해야 겠다고 판단함.
map<int, pair<int,int>>m;으로 해서 번호에 따른 좌표값을 설정함.
왼손 엄지의 위치와 오른손엄지의 좌표값을 이용해야 겠다고 판단했다. 왜냐하면 거리비교를 해야 하므로, 그래서 변수 두개 선언함.
거리값 비교할때는 가운데의 번호 2,5,8,0 일때만 거리 비교를 한다.
거리가 같다면 오른손잡이인지 왼손 잡이인지 확인해서 진행함.
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
string solution(vector<int> numbers, string hand) {
unordered_map<int, pair<int,int>>m;
m.insert({0, {3,1}});
m.insert({1, {0,0}});
m.insert({2, {0,1}});
m.insert({3, {0,2}});
m.insert({4, {1,0}});
m.insert({5, {1,1}});
m.insert({6, {1,2}});
m.insert({7, {2,0}});
m.insert({8, {2,1}});
m.insert({9, {2,2}});
pair<int,int>leftPos ={3,0};
pair<int,int>rightPos = {3,2};
string answer = "";
for(int i = 0; i< numbers.size(); i++)
{
pair<int,int>target = m[numbers[i]];
//엄지 위치 갱신해야 한다.
//왼손 엄지
if(numbers[i] == 1 || numbers[i] == 4
|| numbers[i] == 7)
{
leftPos = m[numbers[i]];
answer += "L";
}
//오른손 엄지
else if(numbers[i] == 3 || numbers[i] == 6
|| numbers[i] == 9)
{
rightPos = m[numbers[i]];
answer += "R";
}
//가운데 값일 경우에는 dist 값 구해서 작은 값으로 갱신해야 한다.
else
{
//왼손의 좌표와 타겟의 좌표 vs 오른손의 좌표와 타겟의 좌표 비교
int distRight = abs(target.first - rightPos.first)
+ abs(target.second - rightPos.second);
int distLeft = abs(target.first - leftPos.first)
+ abs(target.second - leftPos.second);
//오른손 엄지가 왼손 엄지보다 가깝다.
if(distRight < distLeft)
{
rightPos = m[numbers[i]];
answer += "R";
}
else if(distRight > distLeft)
{
leftPos = m[numbers[i]];
answer += "L";
}
//오른손 잡이인지, 왼손잡이인지 확인
else if(distRight == distLeft)
{
if(hand == "left")
{
leftPos = m[numbers[i]];
answer += "L";
}
else if(hand == "right")
{
rightPos = m[numbers[i]];
answer += "R";
}
}
}
}
return answer;
}