문제 푼 날짜 : 2021-09-01
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/67256
키패드를 4x3 배열로 생각하고, 키패드의 위치정보를 vector를 통해 관리한다.(인덱스 순서대로 0~9까지 숫자만 저장)
처음 왼엄지와 오른엄지의 위치를 각각 (3, 0), (3, 2)로 설정해주고, 주어진 다이얼을 누를 때마다 숫자가 1, 4, 7이면 왼엄지를 이용하도록 하고, 3, 6, 9이면 오른엄지를 이용하도록 하고 그 위치로 사용한 엄지의 위치를 업데이트 해준다.
그 외의 숫자이면 왼엄지와 오른엄지와의 거리를 구해주어 어떤 엄지를 사용할지 정해주었다.
이 때, 거리가 같다면 주로 쓰는 손을 체크하여 정해준다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int getDist(pair<int, int> h, pair<int, int> n) {
return abs(n.first - h.first) + abs(n.second - h.second);
}
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<pair<int, int>> v[10];
v[0].push_back(make_pair(3, 1));
int dial = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
v[dial++].push_back(make_pair(i, j));
}
}
pair<int, int> lpos = { 3, 0 };
pair<int, int> rpos = { 3, 2 };
for (int i = 0; i < numbers.size(); i++) {
int num = numbers[i];
pair<int, int> npos = make_pair(v[num].front().first, v[num].front().second);
if (num == 1 || num == 4 || num == 7) {
answer += "L";
lpos = npos;
} else if (num == 3 || num == 6 || num == 9) {
answer += "R";
rpos = npos;
} else {
int ldiff = getDist(lpos, npos);
int rdiff = getDist(rpos, npos);
if (ldiff < rdiff) {
answer += "L";
lpos = npos;
} else if (ldiff > rdiff) {
answer += "R";
rpos = npos;
} else {
if (hand.compare("right") == 0) {
answer += "R";
rpos = npos;
} else {
answer += "L";
lpos = npos;
}
}
}
}
return answer;
}
조건대로 구현해주면 쉽게 풀 수 있는 문제였다.
이런 문제는 좀 더 빠르고 정확하게 읽고, 신속하게 구현할 수 있도록 연습해야겠다.