티스토리 뷰

반응형

 

숫자 배열이 주어지는데

숫자 키패드에서 어느쪽 엄지손가락을 써서 배열의 숫자들을 눌렀을까 알아맞히는 문제


문제의 조건

 

1. 엄지손가락만 사용한다.

 

2. 왼쪽 엄지손가락은 *에서 시작하고 오른쪽 엄지손가락은 #에서 시작한다. 

 

3. 왼쪽 엄지손가락은 1, 4, 7을 누를 수 있고

오른쪽 엄지손가락은 3, 6, 9를 누를 수 있다. 

 

4. 가운데 라인에 있는 숫자들은 현재 손가락이 있는 위치에서 더 가까운 위치에 있는 손가락이 누른다. 

-> 매번 숫자를 누를 때마다 손가락 위치를 저장해야 함 

 

5. 거리 계산은 직선상으로만 하며 대각선으로는 하지 않음 

-> 대각선 위치에 있으면 거리를 2라고 봄 

 

6. 만약 양쪽 손가락 위치에서 눌러야 할 숫자까지 거리가 같으면 오른손잡이면 오른손으로 누르고 왼손잡이면 왼손으로 누른다. 

어느 손잡이인지는 hand라는 이름을 가진 string 매개변수로 주어짐

왼손 = "left"

오른손 = "right"

 


#include <string>
#include <vector>

using namespace std;

//손가락과 숫자들의 키패드 상 좌표를 저장할 구조체 
struct Pos
{
    int x;
    int y;
    
public:
    //키패드간 거리 계산하는 함수 
    int GetDistance(Pos other)
    {
        int X = x - other.x;
        if (0 > X) //음수가 나오면 비트연산으로 양수로 바꿔줌 
            X = ~X+1;
        
        int Y = y - other.y;
        if (0 > Y)
            Y = ~Y+1;
        
        return X+Y;
    }
};

//입력받은 숫자에 따라 키패드상 좌표를 구해주는 함수 
//2차원 배열 인덱스 기준으로 작성함 
Pos GetPosOnDial(int num)
{
    Pos FingerPos;
    
    switch (num)
    {
        case 1:
            FingerPos.x = 0;
            FingerPos.y = 0;
        break;
        
        case 2:
            FingerPos.x = 1;
            FingerPos.y = 0;
        break;
        
        case 3:
            FingerPos.x = 2;
            FingerPos.y = 0;
        break;
        
        case 4:
            FingerPos.x = 0;
            FingerPos.y = 1;
        break;
        
        case 5:
            FingerPos.x = 1;
            FingerPos.y = 1;
        break;
        
        case 6:
            FingerPos.x = 2;
            FingerPos.y = 1;
        break;
        
        case 7:
            FingerPos.x = 0;
            FingerPos.y = 2;
        break;
        
        case 8:
            FingerPos.x = 1;
            FingerPos.y = 2;
        break;
        
        case 9:
            FingerPos.x = 2;
            FingerPos.y = 2;
        break;
        
        case 0:
            FingerPos.x = 1;
            FingerPos.y = 3;
        break;
    }
    
    return FingerPos;
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    
    //가운데 라인 숫자들 좌표 저장
    Pos Two = GetPosOnDial(2);
    Pos Five = GetPosOnDial(5);
    Pos Eight = GetPosOnDial(8);
    Pos Zero = GetPosOnDial(0);
    
    Pos LeftPos = {0,3};
    Pos RightPos = {2,3};
    int iDistFromLeft = 0;
    int iDistFromRight = 0;
    
    for (int i = 0; numbers.size() > i; i++)
    {
        if (1 == numbers[i] || 4 == numbers[i] || 7 == numbers[i])
        {
            answer += "L";
            LeftPos = GetPosOnDial(numbers[i]);
        }
        else if (3 == numbers[i] || 6 == numbers[i] || 9 == numbers[i])
        {
            answer += "R";
            RightPos = GetPosOnDial(numbers[i]);
        }
        else 
        {
            Pos TmpPos;
            switch (numbers[i])
            {
                case 2:
                    TmpPos = Two;
                    break;
                    
                case 5:
                    TmpPos = Five;
                    break;
                    
                case 8:
                    TmpPos = Eight;
                    break;
                    
                case 0:
                    TmpPos = Zero;
                    break;
            }
            
            //양쪽 손가락으로부터의 거리를 구한 후 구한 값을 바탕으로 손가락 결정 
            iDistFromLeft = TmpPos.GetDistance(LeftPos);
            iDistFromRight = TmpPos.GetDistance(RightPos);
            
            if (iDistFromLeft < iDistFromRight)
            {
                answer += "L";
                LeftPos = GetPosOnDial(numbers[i]);
            }
            else if (iDistFromLeft > iDistFromRight)
            {
                answer += "R";
                RightPos = GetPosOnDial(numbers[i]);
            }
            else 
            {
                if ("right" == hand)
                {
                    answer += "R";
                    RightPos = GetPosOnDial(numbers[i]);
                }
                else if ("left" == hand)
                {
                    answer += "L";
                    LeftPos = GetPosOnDial(numbers[i]);
                }
            }
        }
    }
    
    return answer;
}

 

깔끔하지는 않지만...

언젠가 더 깔끔하게 작성할 수 있게 되기를 바라며...

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함