✍ 문제풀이
- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
문제에 제시된 대로 차근차근 구현하면 쉽게 풀리는 문제이다.
🌱 정답코드
더보기
50점 받고 나가리된 코드
- 상하좌우 체크하고 그 왼손이나 오른손이 있으면 갱신한다.
왼손/오른손이 없으면 새로운 거리 값을 구하고, 가까운 손의 값을 갱신해준다.
로 로직을 짰는데, 상하좌우를 체크해줄 필요가 없었다.
아래 문제에 제시된 대로만 구현하면 쉽게 해결되는 문제였다.
4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
#include <string>
#include <vector>
#include <cmath>
using namespace std;
string h;
int leftTouch = 100, rightTouch = 100;
int pad[][4] = {{1,2,3}, {4,5,6},{7,8,9}, {100,0,100}};
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, -1, 1};
string answer;
void next_touch(int num, int l, int r){
int x = 0, y = 0;
for(int i = 0; i < 4; i++){
for(int j = 0; j < 3; j++){
if(num == pad[i][j]){
x = i, y = j;
}
}
}
bool rtouch = false, ltouch = false;
int nx, ny = 0;
for(int i = 0; i < 4; i++){
nx = x + dx[i];
ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= 4 || ny >= 3) continue;
if(pad[nx][ny] == r) rtouch = true;
if(pad[nx][ny] == l) ltouch = true;
}
if(rtouch && ltouch){
if(h == "R") {
answer += 'R';
rightTouch = num;
}else {
answer += "L";
leftTouch = num;
}
}else if(!rtouch && ltouch){
answer += "L";
leftTouch = num;
}else if(rtouch && !ltouch){
answer += 'R';
rightTouch = num;
}else if(!rtouch && !ltouch){
int rx, ry, lx, ly = 0;
for(int i = 0; i < 4; i++){
for(int j = 0; j < 3; j++){
if(l == pad[i][j]){
lx = i, ly = j;
}
if(r == pad[i][j]){
rx = i, ry = j;
}
}
}
// abs(left.first - x ) + abs(left.second - y);
int disL = abs(lx - x) + abs(ly - y);
int disR = abs(rx - x) + abs(ry - y);
if(disL > disR){
answer += 'R';
rightTouch = num;
}else if(disL < disR){
answer += "L";
leftTouch = num;
}else if(disL == disR){
if(h == "R") {
answer += 'R';
rightTouch = num;
}else {
answer += "L";
leftTouch = num;
}
}
}
}
string solution(vector<int> numbers, string hand) {
if(hand == "left") h = 'L';
else h = 'R';
leftTouch = 100, rightTouch = 100;
for(int i = 0; i < numbers.size(); i++){
int n = numbers[i];
if(n == 1 || n == 4 || n == 7){
answer += 'L';
leftTouch = n;
}
if(n == 3 || n == 6 || n == 9){
answer += 'R';
rightTouch = n;
}
if(n == 2 || n == 5 || n == 8 || n == 0){
next_touch(n, leftTouch, rightTouch);
}
}
return answer;
}
'OLD_알고리즘 > Programmers - 알고리즘' 카테고리의 다른 글
Programmers] Lv.2 최댓값과 최솟값 (0) | 2021.06.23 |
---|---|
Programmers - 완전탐색 ] Lv.3 카펫 (0) | 2021.06.14 |
Programmers - 힙 ] Lv.3 이중우선순위큐 (0) | 2021.06.08 |
Programmers - 해시 ] Lv.3 베스트앨범 (0) | 2021.06.07 |
Programmers ] 신규 아이디 추천 (0) | 2021.06.03 |
댓글