[Programmers] Level1 : 키패드 누르기
Question
Solution
- 키패드의 각각의 좌표를 구하는 규칙을 정한다.
- 입력으로 들어오는 값을 3으로 나눈 나머지로 왼손, 오른손, 센터 세가지로 분류가 가능하다.
- 세로로 한 줄 씩 보면 x좌표는 고정이고 y좌표는 3으로 나눈 몫이 된다. (3, 6, 9의 경우는 -1을 해줘야 함)
- 왼손과 오른손의 초기 좌표를 정해주고 규칙에 맞게 버튼을 누를때 마다 위치를 갱신 시킨다.
- 센터는 목표 버튼으로부터 왼손과 오른손의 거리를 비교하여 더 적은 값을 찾는다.
Cord
#include <string>
#include <vector>
using namespace std;
string solution(vector<int> numbers, string hand)
{
string answer = "";
// 왼손과 오른손 초기위치 <x,y>
pair<int, int> lPos;
lPos.first = 0;
lPos.second = 3;
pair<int, int> rPos;
rPos.first = 2;
rPos.second = 3;
for (int i = 0; i < numbers.size(); i++)
{
// 0 에 대한 처리
if (numbers[i] == 0) { numbers[i] = 11; }
if (numbers[i] % 3 == 1) // 1, 4, 7
{
answer += "L";
lPos.first = 0;
lPos.second = numbers[i] / 3;
}
else if (numbers[i] % 3 == 0) // 3, 6, 9
{
answer += "R";
rPos.first = 2;
rPos.second = numbers[i] / 3 - 1;
}
else // 2, 5, 8, 0
{
// 타겟으로부터 왼손과 오른손 거리 비교
int targetX = 1;
int targetY = numbers[i] / 3;
int lDist = (targetX - lPos.first) + abs(targetY - lPos.second);
int rDist = (rPos.first - targetX) + abs(rPos.second - targetY);
if (lDist > rDist)
{
answer += "R";
rPos.first = targetX;
rPos.second = targetY;
}
else if (lDist < rDist)
{
answer += "L";
lPos.first = targetX;
lPos.second = targetY;
}
else // 위치 값이 같을 경우
{
if (hand == "left")
{
answer += "L";
lPos.first = targetX;
lPos.second = targetY;
}
else
{
answer += "R";
rPos.first = targetX;
rPos.second = targetY;
}
}
}
}
return answer;
}