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

1 minute read

문제는 다음과 같다.

오늘은 프로그래머스 키패드 누르기를 풀어보도록 하자. 단순 구현문제이다. 함수를 잘 나누어주고 만일 2,5,8,0이라면 거리와 hand를 따져서 어느 손으로 누를지 선택하면 되겠다. : )

                                     [코드]
#include <string>
#include <vector>
#include <cmath>

using namespace std;

//1,4,7은 Left, 3,6,9는 Right
//2,5,8,0은 거리를 우선 생각해보고 가까운 hand로-> 만일 거리가 가깝다면 hand고려

//키패드 설정(*은 10, #은 11)
vector<vector<int>>key_pad(4,vector<int>(3,0));
//처음 키패드 시작부분 설정
int left_y=3, left_x=0,right_y=3,right_x=2;
//정답(답은 append로 하고 대문자로)
string answer = "";

//왼쪽 세팅
void LeftSetting(int number){
    for(int i=0;i<key_pad.size();i++){
        for(int j=0;j<key_pad[i].size();j++){
            if(number == key_pad[i][j]){
                left_y = i;
                left_x = j;
                answer += 'L';
                return;
            }
        }
    }
}

//오른쪽 세팅
void RightSetting(int number){
    for(int i=0;i<key_pad.size();i++){
        for(int j=0;j<key_pad[i].size();j++){
            if(number == key_pad[i][j]){
                right_y = i;
                right_x = j;
                answer += 'R';
                return;
            }
        }
    }
}

//가운데 세팅
void MiddleSetting(int number, string hand){
    for(int i=0;i<key_pad.size();i++){
        for(int j=0;j<key_pad[i].size();j++){
            if(number == key_pad[i][j]){
                //오른손이 더 가깝다
                if(abs(right_y-i)+abs(right_x-j) < abs(left_y-i)+abs(left_x-j)){
                    right_y=i;
                    right_x=j;
                    answer+='R';
                }
                //왼손이 더 가깝다
                else if(abs(right_y-i)+abs(right_x-j) > abs(left_y-i)+abs(left_x-j)){
                    left_y=i;
                    left_x=j;
                    answer+='L';
                }
                //같다
                else{
                    if(hand == "right"){
                        right_y=i;
                        right_x=j;
                        answer+='R';
                    }
                    else{
                        left_y=i;
                        left_x=j;
                        answer+='L';
                    }
                }
                return;
            }
        }
    }
}
//키패드 
void KeyPadSetting(){
    key_pad[0][0]=1;key_pad[0][1]=2;key_pad[0][2]=3;
    key_pad[1][0]=4;key_pad[1][1]=5;key_pad[1][2]=6;
    key_pad[2][0]=7;key_pad[2][1]=8;key_pad[2][2]=9;
    key_pad[3][0]=10;key_pad[3][1]=0;key_pad[3][2]=11;
}

string solution(vector<int> numbers, string hand) {
    //키패드 세팅
    KeyPadSetting();
    //number size만큼 for문 돌기
    for(int i=0;i<numbers.size();i++){
        //Left설정
        if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
            LeftSetting(numbers[i]);
        }
        //Right설정
        else if(numbers[i] == 3 ||numbers[i] == 6 ||numbers[i] == 9){
            RightSetting(numbers[i]);
        }
        //중간부분설정
        else{
            MiddleSetting(numbers[i], hand);
        }
    }
    return answer;
}