[프로그래머스] 키패드 누르기(C++)



#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()함수를 사용하여 상하좌우로 이동 한 것처럼 구현한다. 오늘 문제를 풀며 깨달은 점은 문제를 제대로 읽는 것이 얼마나 중요한지 알게 되었다.




© 2022. by KSC

Powered by sora