1 분 소요

Question

Q Q2 Q3


Solution

  • 키패드의 각각의 좌표를 구하는 규칙을 정한다.
  • 입력으로 들어오는 값을 3으로 나눈 나머지로 왼손, 오른손, 센터 세가지로 분류가 가능하다.
  • 세로로 한 줄 씩 보면 x좌표는 고정이고 y좌표는 3으로 나눈 몫이 된다. (3, 6, 9의 경우는 -1을 해줘야 함)
  • 왼손과 오른손의 초기 좌표를 정해주고 규칙에 맞게 버튼을 누를때 마다 위치를 갱신 시킨다.
  • 센터는 목표 버튼으로부터 왼손과 오른손의 거리를 비교하여 더 적은 값을 찾는다.

Cord

#include <string>
#include <vector>

using namespace std;

string solution(vector<int> numbers, string hand) 
{
    string answer = "";
    
    // 왼손과 오른손 초기위치 <x,y>
    pair<int, int> lPos;
    lPos.first = 0;
    lPos.second = 3;
    pair<int, int> rPos;
    rPos.first = 2;
    rPos.second = 3;
    
    for (int i = 0; i < numbers.size(); i++)
    {   
        // 0 에 대한 처리
        if (numbers[i] == 0) { numbers[i] = 11; } 
        
        if (numbers[i] % 3 == 1) // 1, 4, 7
        {
            answer += "L";
            lPos.first = 0;
            lPos.second = numbers[i] / 3;
        }
        else if (numbers[i] % 3 == 0) // 3, 6, 9
        {
            answer += "R";
            rPos.first = 2;
            rPos.second = numbers[i] / 3 - 1;
        }
        else  // 2, 5, 8, 0
        {
            // 타겟으로부터 왼손과 오른손 거리 비교
            int targetX = 1; 
            int targetY = numbers[i] / 3;
            int lDist = (targetX - lPos.first) + abs(targetY - lPos.second);
            int rDist = (rPos.first - targetX) + abs(rPos.second - targetY);
            
            if (lDist > rDist)
            {
                answer += "R";
                rPos.first = targetX;
                rPos.second = targetY;
            }
            else if (lDist < rDist)
            {
                answer += "L";
                lPos.first = targetX;
                lPos.second = targetY;
            }
            else // 위치 값이 같을 경우
            {
                if (hand == "left")
                {
                    answer += "L";
                    lPos.first = targetX;
                    lPos.second = targetY;
                }
                else 
                {
                    answer += "R";
                    rPos.first = targetX;
                    rPos.second = targetY;
                }
            }
        }
    }
    
    return answer;
}

Result

Result