#include <string>
#include <vector>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<pair<int, int>> lists(13); //키패드 위치
int left = 10; //*
int right = 12; //#
{ //현재 번호의 키패드 위치를 넣는다.
int counts = 1;
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 3; j++)
{
lists[counts].first = j;
lists[counts].second = i;
counts++;
}
}
}
for(int i = 0; i < numbers.size(); i++)
{
//고정된 키값은 바로 적용
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7)
{
left = numbers[i];
answer += "L";
}
else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9)
{
right = numbers[i];
answer += "R";
}
else
{ // 0은 11번째칸으로 인식하게
if(numbers[i] == 0)
numbers[i] = 11;
//각 위치에서의 거리를 계산한다.
int leftLen = abs(lists[numbers[i]].first - lists[left].first);
leftLen += abs(lists[numbers[i]].second - lists[left].second);
int rightLen = abs(lists[numbers[i]].first - lists[right].first);
rightLen += abs(lists[numbers[i]].second - lists[right].second);
//어느손잡이인지
if(leftLen == rightLen)
{
if(hand == "right")
{
answer += "R";
right = numbers[i];
}
else
{
answer += "L";
left = numbers[i];
}
}
else //거리가 작을수록 다음키
{
if(leftLen < rightLen)
{
answer += "L";
left = numbers[i];
}
else
{
answer += "R";
right = numbers[i];
}
}
}
}
return answer;
}
풀이
- 각 번호에 해당하는 위치를 넣어준다.
- 고정 위치는 바로 계산한다.
- 가운데는 각 번호에 해당하는 왼, 오른손의 위치와 누를 위치의 거리를 계산한다.
여기서 계산은
x로 몇칸, y로 몇칸 차이나는지를 구하여 총 얼마의 거리를 나타내는지를 구하여
비교하면 어떤 손으로 칠지를 구할 수 있다. 거리가 같다면 오른손잡이면 오른손, 왼손잡이면 왼손으로 한다.
처음에는 각 위치의 연결된 리스트를 만들어서 순회한 만큼을 구하려했다.
하지만 너무 복잡하다고 생각했는데 이런 방법이 생각나서 풀게 되었다.
문제 링크 : programmers.co.kr/learn/courses/30/lessons/67256
'Algorithm > Programmers' 카테고리의 다른 글
[C++] 프로그래머스 수식최대화 2020카카오인턴십 (0) | 2021.05.06 |
---|---|
[C++] 프로그래머스 여행경로 DFS/BFS (0) | 2021.05.06 |
[C++] 프로그래머스 더 맵게 힙 (0) | 2021.05.04 |
[C++] 프로그래머스 프린터 스택/큐 (0) | 2021.05.04 |
[C++] 프로그래머스 기능개발 스택/큐 (0) | 2021.05.03 |