https://school.programmers.co.kr/learn/courses/30/lessons/67256
- 넘버가 1,4,7이면 왼쪽 / 3,6,9면 오른쪽
- 아니면 왼쪽 현재 위치와 오른쪽 현재 위치 각각에서 거리를 구해서 작은 곳으로 가도록 한다.
왼쪽 현재 위치, 오른쪽 현재 위치를 각각 저장하였다.
그리고 각 키패드에서의 위치, 어느 손으로 누를 것인지 등이 필요해 클래스를 만들어 벡터에 넣었다.
0을 처음에 넣었어야 했는데 이를 놓쳐서 한 번 틀렸었다ㅎ
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class Keypad {
public:
int number; // 번호
pair<int, int> pos;
string hand;
Keypad(char number, int x, int y) {
this->number = number;
pos = {y, x};
if (number == 1 || number == 4 || number == 7)
hand = 'L';
else if (number == 3 || number == 6 || number == 9)
hand = 'R';
else
hand = "";
}
int getDistance(pair<int, int> other) {
return abs(pos.first - other.first) + abs(pos.second - other.second);
}
};
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<Keypad> keypads;
int x=0, y=0;
Keypad zero(0, 1, 3);
keypads.push_back(zero);
for(int i=1; i<=9; i++) {
Keypad k(i, x, y);
keypads.push_back(k);
x++;
if (x % 3 == 0) {
y++;
x = 0;
}
}
// y, x
pair<int, int> leftPos = {3, 0};
pair<int, int> rightPos = {3, 2};
for(int targetNumber : numbers) {
Keypad k = keypads[targetNumber];
string currHand = k.hand;
if (currHand == "") {
int leftDiff = k.getDistance(leftPos);
int rightDiff = k.getDistance(rightPos);
if (leftDiff < rightDiff) {
leftPos = k.pos;
answer += "L";
} else if (leftDiff > rightDiff) {
rightPos = k.pos;
answer += "R";
} else {
if (hand == "right") {
rightPos = k.pos;
answer += "R";
} else {
leftPos = k.pos;
answer += "L";
}
}
} else {
answer += currHand;
if (currHand == "L") leftPos = k.pos;
else rightPos = k.pos;
}
}
return answer;
}
깔끔하게 짜려고 하다 보니 쉬운 레벨의 문제임에도 1시간 가량 소요했다.. 그래도 덜깔끔하지만
코테인 만큼 정답을 내는 데 집중하도록 하자.