풀이
처음에는 이 문제를 보고 어떤 자료구조를 사용해야 빠르게 해결할 수 있을까?를 많이 고민한 문제.
문제에서 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;
}
'Algorithm' 카테고리의 다른 글
[백준 9663] N-Queen (C++) (0) | 2021.05.20 |
---|---|
[프로그래머스] 프린터 (C++) (0) | 2021.05.20 |
[프로그래머스] 완주하지 못한 선수 (C++) (0) | 2021.04.30 |
[프로그래머스] 크레인 인형뽑기 게임 (C++) (0) | 2021.04.30 |
[백준 14469] 소가 길을 건너간 이유3 (C++) (0) | 2021.04.29 |