문제의 핵심은 번호의 위치를 좌표로 어떻게 표혈한 것인가 ? 이다. 그 이후의 다른 부분은 그냥 문제를 읽고 if문으로 처리해주면 된다.
y위치는 num/3을 해주고, x위치는 0번째 인덱스 부터 시작하기 때문에 num%3 -1을 해준다.
그리고 제일 오른쪽 번호(3,6,9)에서 처리를 해주어야 하는데 3,6,9에서는 num%3값이 0이 되기 때문에 임의로 2를 넣어주어여 하며, y위치 역시 y위치로 +1값이 되기 때문에 -1을 해주어야 한다. 그 외부분은 문제의 설명대로 구하면 된다.
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
int distance(int x1, int y1, int x2, int y2) // 두 점의 거리
{
return abs(x2 - x1) + abs(y2 - y1);
}
string solution(vector<int> numbers, string hand)
{
string answer = "";
int leftX = 0;
int leftY = 3;
int rightX = 2;
int rightY = 3;
int curX, curY;
for (int i = 0; i < numbers.size(); i++)
{
int num = numbers[i];
int curY = num / 3;
int curX = (num % 3) - 1;
if (num % 3 == 0)
{
curY--;
curX = 2;
}
if (num == 0)
{
curY = 3;
curX = 1;
}
if (num == 1 || num == 4 || num == 7)
{
leftX = curX;
leftY = curY;
answer += "L";
continue;
}
else if (num == 3 || num == 6 || num == 9)
{
rightX = curX;
rightY = curY;
answer += "R";
continue;
}
int leftDistance = distance(leftX, leftY, curX, curY);
int rightDistance = distance(rightX, rightY, curX, curY);
if (leftDistance < rightDistance)
{ // 왼쪽이 더 짧은 경우
leftX = curX;
leftY = curY;
answer += "L";
}
else if (rightDistance < leftDistance)
{ // 오른쪽이 더 짧은경우
rightX = curX;
rightY = curY;
answer += "R";
}
else
{ // 길이가 같은 경우
if (hand == "left")
{
leftX = curX;
leftY = curY;
answer += "L";
}
else
{
rightX = curX;
rightY = curY;
answer += "R";
}
}
}
cout << answer << endl;
return answer;
}
'알고리즘 문제' 카테고리의 다른 글
[알고리즘 문제] 백준1038 - 감소하는 수 (0) | 2020.10.13 |
---|---|
[알고리즘문제] 프로그래머스 - 경주로 건설 (0) | 2020.09.25 |
[알고리즘 문제] 백준2606 - 바이러스 (0) | 2020.09.21 |
[알고리즘 문제] 백준17471 - 게리멘더링 (0) | 2020.09.11 |
[알고리즘 문제] 백준14697 - 방 배정하기 (0) | 2020.09.11 |