bdfgdfg

[레벨 1] 키패드 누르기 본문

코딩테스트/프로그래머스

[레벨 1] 키패드 누르기

marmelo12 2021. 10. 27. 17:16
반응형
#include <string>
#include <vector>

using namespace std;
int CalDistance(pair<int, int>& handPos, pair<int, int>& targetPos)
{
    int dist = (handPos.first > targetPos.first) ?
        handPos.first - targetPos.first : targetPos.first - handPos.first;
    if (handPos.second == 1) // 2580 라인일때
        return dist;
    return dist + 1;
}
void CheckHand(string& answer, pair<int, int>& leftHandPos, pair<int, int>& rightHandPos,
    pair<int, int> targetPos,string& hand)
{
    int left = CalDistance(leftHandPos, targetPos);
    int right = CalDistance(rightHandPos, targetPos);
    if (left == right)
    {
        if (hand == "right")
        {
            rightHandPos = targetPos;
            answer += "R";
        }
        else
        {
            leftHandPos = targetPos;
            answer += "L";
        }
    }
    else if (left > right)
    {
        rightHandPos = targetPos;
        answer += "R";
    }
    else
    {
        leftHandPos = targetPos;
        answer += "L";
    }
}
string solution(vector<int> numbers, string hand) {
    string answer = "";

    // 거리가같으면 왼손/오른손잡이에 따라.
    int len = numbers.size();
    int leftDistance = 0, rightDistance = 0;
    pair<int, int> left = make_pair(3, 0);
    pair<int, int> right = make_pair(3, 2);
    for (int i = 0; i < len; ++i)
    {
        switch (numbers[i])
        {
        case 1:
            answer += "L";
            left = make_pair(0, 0);
            break;
        case 4:
            answer += "L";
            left = make_pair(1, 0);
            break;
        case 7:
            answer += "L";
            left = make_pair(2, 0);
            break;

        case 3:
            answer += "R";
            right = make_pair(0, 2);
            break;
        case 6:
            answer += "R";
            right = make_pair(1, 2);
            break;
        case 9:
            answer += "R";
            right = make_pair(2, 2);
            break;

        case 2:
            CheckHand(answer, left, right, pair<int, int> {0, 1}, hand);
            break;
        case 5:
            CheckHand(answer, left, right, pair<int, int> {1, 1}, hand);
            break;
        case 8:
            CheckHand(answer, left, right, pair<int, int> {2, 1}, hand);
            break;
        case 0:
            CheckHand(answer, left, right, pair<int, int> {3, 1}, hand);
            break;
        }
    }
    return answer;
}

1,4,7은 무조건 왼손 3,6,9는 무조건 오른손

2,5,8,0일 땐 left와 right hand의 거리를 비교. 같으면 왼손잡인지 오른손잡이인지에 따라 리턴.

만약 손의 위치가 1열 (2,5,8,0)에 위치한다면 +1하지않음 (+1하는 이유가 1,4,7,3,6,9라인에서 한칸 오른쪽 왼쪽 움직일 때.)

 

반응형
Comments