Deff_Dev

[프로그래머스] 키패드 누르기 (C++) 본문

코딩테스트/프로그래머스

[프로그래머스] 키패드 누르기 (C++)

Deff_a 2024. 9. 5. 14:01

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

키패드는 정해져있기 때문에 0 ~ 9, #, * 의 좌표를 저장한다.

 

Left는 #(10), Right는 *(11)에서 시작한다.

 

1, 4, 7을 누를 땐 Left, 3, 6, 9를 누를 땐 Right로 누르고 현재 엄지 손가락 위치를 저장한다.

2, 5, 8, 0을  누를 땐, 현재 손가락 위치에 따라 가장 가까운 쪽의 엄지 손가락으로 누른다.

#include <string>
#include <vector>

using namespace std;

int dial [12][2] = {{4,2},{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3} ,{4,1} ,{4,3}};

string solution(vector<int> numbers, string hand) {
    string answer = "";
    
    int left= 10 , right = 11;
    for(int i = 0; i < numbers.size(); i++){
        if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
            answer += "L";
            left = numbers[i];
        }   
        else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
            answer += "R";
            right = numbers[i];
        }
        else{
            int targetY = dial[numbers[i]][0];
            int targetX = dial[numbers[i]][1];
          int curLeft = abs(targetY - dial[left][0]) + abs(targetX - dial[left][1]);
            int curRight = abs(targetY - dial[right][0]) + abs(targetX - dial[right][1]);

            if(curRight == curLeft){
                if(hand == "right"){
                    answer += "R";
                    right = numbers[i];
                }
                else{
                    answer += "L";
                    left = numbers[i];
                } 
            }
            else if(curRight < curLeft){
                    answer += "R";
                    right = numbers[i];
            }
            else
            {
                    answer += "L";
                    left = numbers[i];
            }
        }
    }
    
    return answer;
}