https://programmers.co.kr/learn/courses/30/lessons/67256-

string getDistance(unordered_map<int, pair<int, int>>& umap, int* save, int number, string& hand) {
	string output = "";
	pair<int, int> leftPos{umap[save[0]].first, umap[save[0]].second};
	pair<int, int> rightPos{ umap[save[1]].first, umap[save[1]].second };
	pair<int, int> findPos{ umap[number].first, umap[number].second };
	int lDis, rDis;
	lDis = abs(findPos.first - leftPos.first) + abs(findPos.second - leftPos.second);
	rDis = abs(findPos.first - rightPos.first) + abs(findPos.second - rightPos.second);

	if (lDis == rDis) {
		if (hand == "R") save[1] = number;
		else save[0] = number;
		return hand;
	}
	else if (lDis < rDis) {
		save[0] = number;
		return output = "L";
	}
	else {
		save[1] = number;
		return output = "R";
	}
	
}
string solution(vector<int> numbers, string hand) {
	string answer = "";
	int save[2] = { -1, -1 };
	int left = 0, right = 1;
	unordered_map<int, pair<int, int>> umap;
	umap.emplace(1, make_pair(0, 0));
	umap.emplace(2, make_pair(0, 1));
	umap.emplace(3, make_pair(0, 2));
	umap.emplace(4, make_pair(1, 0));
	umap.emplace(5, make_pair(1, 1));
	umap.emplace(6, make_pair(1, 2));
	umap.emplace(7, make_pair(2, 0));
	umap.emplace(8, make_pair(2, 1));
	umap.emplace(9, make_pair(2, 2));
	umap.emplace(-1, make_pair(3, 0));
	umap.emplace(0, make_pair(3, 1));
	umap.emplace(-1, make_pair(3, 2));

	if (hand == "right") hand = "R";
	else hand = "L";

	for (int i = 0; i < numbers.size(); i++) {
		if (numbers[i] % 3 == 1) {
			answer += "L";
			save[left] = numbers[i];
		}
		else if (numbers[i] % 3 == 0 && numbers[i] != 0) {
			answer += "R";
			save[right] = numbers[i];
		}
		else {
			string result = getDistance(umap, save, numbers[i], hand);
			answer += result;
		}
	}

	return answer;
}