코드가 조금 지저분해 보이기는 하지만 오랜만에 풀이를 안 보고 문제를 풀었던 것 같습니다.
풀이 과정
- 문제에 오른손과 왼손의 거리가 같을 경우, 거리가 가까운 경우와 같은 거리와 관련된 조건이 있었기 때문에 거리를 구하기 위한 좌표가 필요하다고 생각했습니다. vector에 담겨 있는 번호들의 좌표를 알기 위해서 keypad라는 변수를 하나 만들어서 1~9, 0, *, #를 저장해주었습니다.
- 저장된 keypad의 숫자와 vector에 들어가 있는 숫자를 비교하여 vector에 담겨 있는 숫자의 좌표를 queue에 담아주었습니다.
- 처음 시작이 왼손의 경우 '*', 오른손의 경우 '#'이기 때문에 rx, ry, lx, ly를 아래와 같이 초기화해주었고, numbers size만큼 for문을 돌면서 숫자 하나씩 조건에 맞게 L와 R를 지정해주었습니다.
- 앞에서 키패드의 좌표를 저장해둔 point 큐에서 numbers[i] 숫자의 좌표를, numbers[i]에서 현재 숫자를 꺼내왔습니다.
- 조건에 따라 numbers[i]가 1, 4, 7일 경우 왼손으로 터치해야 하기 때문에 temp에 'L'을 추가해주고, lx와 ly의 좌표를 현재 숫자(number[i])의 좌표로 변경해주었습니다. 현재 숫자가 3, 6, 9일 때에도 같은 방법으로 진행하였습니다.
- 현재 숫자가 (5)에서 나온 숫자 이외일 경우(2, 5, 8, 0) 이전의 right x, y 좌표와 현재 숫자의 x, y 좌표의 거리를 구하고, left x, y 좌표와 현재 숫자의 x, y 좌표의 거리를 구해줍니다.
- right와 left의 거리가 같을 경우 왼손, 오른손을 따져서 'L', 'R'을 temp 변수에 추가해주고, 그 이외의 경우에는 거리가 가까운 손을 temp 변수에 추가해주었습니다.
#include <string>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
char keypad[13][13];
string findAnswer(queue<pair<int,int>> point, vector<int> numbers, string hand){
string temp;
int rx = 3, ry = 2;
int lx = 3, ly = 0;
for (int i = 0; i < numbers.size(); i++) {
int curx = point.front().first;
int cury = point.front().second;
int num = numbers[i];
point.pop();
if (num == 1 || num == 4 || num == 7) {
temp += 'L';
lx = curx; ly = cury;
}
else if (num == 3 || num == 6 || num == 9) {
temp += 'R';
rx = curx; ry = cury;
}
else {
int rightDist = abs(rx - curx) + abs(ry - cury);
int leftDist = abs(lx - curx) + abs(ly - cury);
if (rightDist == leftDist) {
if (hand == "right") {
temp += 'R';
rx = curx; ry = cury;
}
else {
temp += 'L';
lx = curx; ly = cury;
}
}
else if (rightDist < leftDist) {
temp += 'R';
rx = curx; ry = cury;
}
else {
temp += 'L';
lx = curx; ly = cury;
}
}
}
return temp;
}
string solution(vector<int> numbers, string hand) {
string answer = "";
queue<pair<int,int>> point;
int num=1;
keypad[3][0] = '*'; keypad[3][1] = '0'; keypad[3][2] ='#';
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
keypad[i][j] = num + '0';
num++;
}
}
for(int k=0;k<numbers.size();k++){
bool flag = false;
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
if(keypad[i][j]-'0' == numbers[k]){
point.push({i,j});
flag = true;
break;
}
}
if(flag) break;
}
}
answer = findAnswer(point, numbers, hand);
return answer;
}
'Koala - 4기' 카테고리의 다른 글
프로그래머스 : 키패드 누르기 (0) | 2021.08.12 |
---|---|
[프로그래머스] 키패드 누르기 (0) | 2021.08.12 |
[프로그래머스] 자물쇠와 열쇠 (0) | 2021.08.11 |
[프로그래머스] 보석 쇼핑 (1) | 2021.08.11 |
프로그래머스 : 보석 쇼핑 (only 정확성) (2) | 2021.08.10 |