풀이

처음에는 이 문제를 보고 어떤 자료구조를 사용해야 빠르게 해결할 수 있을까?를 많이 고민한 문제.

문제에서 2, 5, 8, 0을 누를 때는 왼쪽 엄지랑 오른쪽 엄지중 더 가까운 곳에 있는 엄지가 먼저 누르기 때문에

좌표를 사용해야겠다는 생각이 떠올랐다.

 

좌표 (행,열) 기준!

1번 키패드의 좌표는 (0, 0)

2번 키패드의 좌표는 (0, 1)

0번 키패드의 좌표는 (3, 1)

~번 키패드의 좌표를 표시해주는 자료구조 중 map을 사용하면 편할 거 같아서 map을 채택하면 쉽게 구현할 수 있다.

이렇게 각 키패드 번호마다 좌표를 부여해서, 해당 키패드를 누를 때 왼쪽 엄지랑 오른쪽 엄지의 거리를 구해서 더 작은 거리를 가진 엄지가 먼저 누르도록 구현하면 된다.

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

map<char, pair<int,int>> m;

void init() {
    m['1'] = pair<int,int>(0,0);
    m['2'] = pair<int,int>(0,1);
    m['3'] = pair<int,int>(0,2);
    m['4'] = pair<int,int>(1,0);
    m['5'] = pair<int,int>(1,1);
    m['6'] = pair<int,int>(1,2);
    m['7'] = pair<int,int>(2,0);
    m['8'] = pair<int,int>(2,1);
    m['9'] = pair<int,int>(2,2);
    m['*'] = pair<int,int>(3,0);
    m['0'] = pair<int,int>(3,1);
    m['#'] = pair<int,int>(3,2);
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    
    char left = '*';
    char right = '#';
    init();
    
    for(int i = 0; i < numbers.size(); i++) {
        int n = numbers[i];
        
        if(n == 1 || n == 4 || n == 7) answer += "L";
        else if(n == 3 || n == 6 || n == 9) answer += "R";
        else {
            int left_distance = abs(m[left].first - m[n + '0'].first) + abs(m[left].second - m[n + '0'].second);
            int right_distance = abs(m[right].first - m[n + '0'].first) + abs(m[right].second - m[n + '0'].second);
            if(left_distance == right_distance) {
                if(hand == "left")
                    answer += "L";
                else
                    answer += "R";
            }
            else if(left_distance < right_distance) answer += "L";
            else answer += "R";
        }
        
        if(answer.back() == 'R')
            right = n + '0';
        else
            left = n + '0';
    }
    
    return answer;
}

+ Recent posts