728x90
반응형
문제 : 키패드 누르기
풀이 방법
키패드의 위치를 어떻게 구할까 생각하다가 그냥 각 키패드 번호의 좌표계를 만들어서 두 점사이의 거리 공식을 이용하면 풀 수 있겠다고 생각을 했었습니다.
왼쪽 열과 오른쪽 열은 무조건 누르는 손가락이 정해져있지만 가온데 열은 가까운 손가락으로 누르는 조건이 있습니다.
그렇다면 두 점사이의 거리 공식을 이용하면 구하겠지 했는데 막상 만들어 보니 실패라고 뜨더군요.
알고보니 유클리드 거리를 쓰는게 아니라 맨해튼 거리를 쓰는 것이 정답이었습니다.
우리가 알고 있는 두 점 사이의 공식이 유클리드 거리었고
이게 맨해튼 거리라고 합니다.
문제 조건에 상하좌우로 1칸씩 움직인다고 했기 때문에 맨해튼 거리 공식을 써서 풀어야 했던겁니다.
소스 코드
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
vector<vector<int>> hand_pos = {{0, 3},{2, 3}};
vector<vector<int>> keypad_pos;
// 1번부터 0,0 #을 2,3까지 해서 좌표로 넣음
for(int i=0; i<4; i++) {
for(int u=0; u<3; u++) {
vector<int> temp;
temp.push_back(u);
temp.push_back(i);
keypad_pos.push_back(temp);
}
}
for(int & i : numbers) {
if(i==1 || i==4 || i==7) {
answer.push_back('L');
hand_pos[0] = keypad_pos[i-1];
}
else if(i==3 || i==6 || i==9) {
answer.push_back('R');
hand_pos[1] = keypad_pos[i-1];
}
// 좌표 계산에 따른 결정
else if(i==2 || i==5 || i==8 || i==0) {
int index;
if(i == 0 ) index = 11;
else index = i;
double temp[2];
for(int u=0; u<2; u++) {
temp[u] = abs(keypad_pos[index-1][0] - hand_pos[u][0]) +
abs(keypad_pos[index-1][1] - hand_pos[u][1]);
}
if(temp[0] < temp[1]) {
answer.push_back('L');
hand_pos[0] = keypad_pos[index-1];
}
else if(temp[0] == temp[1]) {
if(hand == "left") {
answer.push_back('L');
hand_pos[0] = keypad_pos[index-1];
}
else {
answer.push_back('R');
hand_pos[1] = keypad_pos[index-1];
}
}
else {
answer.push_back('R');
hand_pos[1] = keypad_pos[index-1];
}
}
}
return answer;
}
728x90
반응형
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Level 2, C++] N-Queen (0) | 2022.07.13 |
---|---|
[프로그래머스 Level 1, C++] 신고 결과 받기 (0) | 2022.07.09 |
[프로그래머스 Level 1, C++] 크레인 인형뽑기 게임 (0) | 2022.07.08 |
[프로그래머스 Level 1, C++] 실패율 (0) | 2022.07.07 |
[프로그래머스 Level 1, C++] [1차] 다트 게임 (0) | 2022.07.06 |