#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<int> left_numbers({ 1, 4, 7, -1 }); // 왼쪽 사이드 버튼들로 여기 버튼들은 무조건 왼손으로만 누른다.
vector<int> right_numbers({ 3, 6, 9, -2 }); // 오른쪽 사이트 버튼들로 여기 버튼들은 무조건 오른손으로만 누른다.
vector<int> mid_numbers({ 2, 5, 8, 0 }); // 가운데 사이드 버튼들로 누르기 위해 거리를 계산해야하는 버튼들.
int last_left_finger = -1, last_right_finger = -2; // 직전에 각 손이 누른 번호를 기록. -> 직전 버튼과 현재 버튼 사이에 거리를 구해야하기 때문
bool last_left_flag = true, last_right_flag = true;
// 각손의 직전에 누른 버튼이 각 사이드를 눌렀는지 여부. -> 사이드를 눌렀을 때와 가운데 사이드를 눌렀을 때의 거리 계산이 다르기 때문에 식별해야함.
int left_distance = 0, right_distance = 0; // 왼손과의 거리, 오른손과의 거리
for(auto now_number : numbers) // 누른 번호들을 하나씩 순회하면서
{
if(find(left_numbers.begin(), left_numbers.end(), now_number) != left_numbers.end()) // 왼쪽 사이드에 있는 번호라면
{
answer += "L"; // 답을 작성
last_left_finger = now_number; // 직전 누른 번호를 갱신
last_left_flag = true; // 사이드 번호를 눌렀으니 true로 갱신
}
else if(find(right_numbers.begin(), right_numbers.end(), now_number) != right_numbers.end())
{
answer += "R"; // 답을 작성
last_right_finger = now_number; // 직전 누른 번호를 갱신
last_right_flag = true; // 사이드 번호를 눌렀으니 true로 갱신
}
else // 만약에 현재 누른 버튼이 가운데 사이드라면 직전에 눌린
{
if(last_left_flag == false) // 왼손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면
{ // 단순 인덱스 차 계산을 진행한다.
left_distance = find(mid_numbers.begin(), mid_numbers.end(), last_left_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
left_distance = (left_distance<0)? left_distance * -1 : left_distance;
}
if(last_right_flag == false) // 오른손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면
{ // 단순 인덱스 차 계산을 진행한다.
right_distance = find(mid_numbers.begin(), mid_numbers.end(), last_right_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
right_distance = (right_distance<0)? right_distance * -1 : right_distance;
}
if(last_left_flag == true) // 왼손이 마지막으로 눌렀던 번호가 왼쪽 사이드의 버튼을 눌렀다면
{ // 현재 눌린 번호로부터 왼쪽 손의 왼쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
int idx = find(left_numbers.begin(), left_numbers.end(), last_left_finger) - left_numbers.begin();
for(int i=0; i<mid_numbers.size(); i++)
if( mid_numbers[i] == now_number )
left_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
}
if(last_right_flag == true) // 오른손이 마지막으로 눌렀던 번호가 오른쪽 사이드의 버튼을 눌렀다면
{ // 현재 눌린 번호로부터 오른쪽 손의 오른쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
int idx = find(right_numbers.begin(), right_numbers.end(), last_right_finger) - right_numbers.begin();
for(int i=0; i<mid_numbers.size(); i++)
if( mid_numbers[i] == now_number )
right_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
}
// 아래부터는 거리를 계산하여 가까운 쪽 손으로 처리를 하되, 거리가 같은 경우에는 main손?으로 처리한다.
if(left_distance < right_distance)
{
last_left_flag = false;
last_left_finger = now_number;
answer += "L";
}
else if(left_distance > right_distance)
{
last_right_flag = false;
last_right_finger = now_number;
answer += "R";
}
else if(left_distance == right_distance)
{
if(hand == "left")
{
last_left_flag = false;
last_left_finger = now_number;
answer += "L";
}
else if(hand == "right")
{
last_right_flag = false;
last_right_finger = now_number;
answer += "R";
}
}
}
}
return answer;
}