알고리즘 문제/C++

[프로그래머스] Level1 : 키패드 누르기 - C++

lingk 2020. 7. 3. 23:29

 

#include <string>
#include <vector>
#include <map>
using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    vector<int> L={-1,-1};
    vector<int> R={1,-1};
    map<int,int> M;
    M.insert(pair<int,int>(2,2));
    M.insert(pair<int,int>(5,1));
    M.insert(pair<int,int>(8,0));
    M.insert(pair<int,int>(0,-1));
    
    for(int i=0;i<numbers.size();i++){
        switch(numbers[i]){
            case 1:answer+='L'; L[0]=-1;L[1]=2;break;
            case 4: answer+='L'; L[0]=-1;L[1]=1;break;
            case 7:answer+='L';L[0]=-1;L[1]=0;break;
            case 3:answer+='R'; R[0]=1;R[1]=2;break;
            case 6:answer+='R'; R[0]=1;R[1]=1;break;
            case 9:answer+='R'; R[0]=1;R[1]=0;break;
            case 2:case 5: case 8:case 0:
                    if(abs(L[1]-M[numbers[i]])+abs(L[0])<abs(R[1]-M[numbers[i]])+abs(R[0]))
                        {L[0]=0;L[1]=M[numbers[i]];answer+='L';}
                    else if(abs(L[1]-M[numbers[i]])+abs(L[0])>abs(R[1]-M[numbers[i]])+abs(R[0]))
                        {R[0]=0;R[1]=M[numbers[i]];answer+='R';}
                    else{
                        if(hand=="right")
                            {R[0]=0;R[1]=M[numbers[i]];answer+='R';}
                        else{L[0]=0;L[1]=M[numbers[i]];answer+='L';}
                    }
                
        }
        
    }
    return answer;
}

 

다음과 같이 절대적인 좌표값을 설정하여 해결하였다.

-1,2 0,2 1,2
-1,1 0,1 1,1
-1,0 0,0 1,0
-1,-1 0,-1 1,-1

가운데 숫자 2, 5, 8, 0(x좌표가 0인 경우)를 눌러줄 때는 다이얼과 (오른손과 왼손 검지의 현재 위치)의 거리에 따라 결정된다. 따라서 abs함수를 통해 절대값으로 비교해주었다. 거리가 같은경우는 인자 hand의 값에 따라 결정된다.

반응형