GitHubSeob

C++ / 프로그래머스 / 키패드 누르기 본문

Programmers/Level 1

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

GitHubSeob 2021. 8. 8.

문제

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

문제풀이

int left_num = 10;
int right_num = 11;
int left_y;
int left_x;
int right_y;
int right_x;
vector<vector<int>>keypad = { {1,2,3},{4,5,6},{7,8,9},{10,0,11} };

키패드는 숫자는 숫자 그대로, *과 #은 10과 11로 표현했다.

left_num은 현재 왼손 엄지손가락이 어느 숫자 위에 있는지를 나타낸다.

right_num은 현재 오른손 엄지손가락이 어느 숫자 위에 있는지를 나타낸다.

left_y와 left_x는 키패드 번호 기준으로 왼손 엄지손가락의 좌표를 저장한다.

right_y와 right_x는 키패드 번호 기준으로 왼손 엄지손가락의 좌표를 저장한다.

 

if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
    left_num = numbers[i];
    answer.push_back('L');
}
else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
    right_num = numbers[i];
    answer.push_back('R');
}

1, 4, 7은 무조건 왼손으로 누르므로 L을 answer에 집어넣고, 왼손 값을 바꾼다.

3, 6, 9는 무조건 오른손으로 누르므로 R을 answer에 집어넣고, 오른손 값을 바꾼다.

 

for (int i = 0; i < numbers.size(); ++i) {
    Find();
    if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
        left_num = numbers[i];
        answer.push_back('L');
    }
    else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
        right_num = numbers[i];
        answer.push_back('R');
    }
    else {
        for (int y = 0; y < 4; ++y) {
            for (int x = 0; x < 3; ++x) {
                if (numbers[i] == keypad[y][x]) {
                    int dis_l = abs(x - left_x) + abs(y - left_y);
                    int dis_r = abs(x - right_x) + abs(y - right_y);
                    if (dis_l == dis_r) {
                        if (hand[0] == 'l') {
                            left_num = numbers[i];
                            answer.push_back('L');
                        }
                        else {
                            right_num = numbers[i];
                            answer.push_back('R');
                        }
                    }
                    else if (dis_l > dis_r) {
                        right_num = numbers[i];
                        answer.push_back('R');
                    }
                    else {
                        left_num = numbers[i];
                        answer.push_back('L');
                    }
                    break;
                }
            }
        }
    }
}

이번 턴에 누르려는 번호와 각 손 엄지손가락의 좌표 차이를 나타내기 위한 변수 dis_l, dis_r을 선언하고, 절댓값을 하여 좌표의 거리를 구한다.

만약 거리가 같다면 왼손잡이인지, 오른손잡이인지 확인하고 answer에 push 한다.

길이가 다르면 짧은 쪽의 손가락으로 누르고 num값을 바꾼다.

 

 

코드

#include <string>
#include <vector>
#include <cmath>

using namespace std;

int left_num = 10;
int right_num = 11;
int left_y;
int left_x;
int right_y;
int right_x;
vector<vector<int>>keypad = { {1,2,3},{4,5,6},{7,8,9},{10,0,11} };

void Find() {
    for (int y = 0; y < 4; ++y) {
        for (int x = 0; x < 3; ++x) {
            if (keypad[y][x] == left_num) {
                left_y = y;
                left_x = x;
            }
            if (keypad[y][x] == right_num) {
                right_y = y;
                right_x = x;
            }
        }
    }
}


string solution(vector<int> numbers, string hand) {
    string answer = "";
    for (int i = 0; i < numbers.size(); ++i) {
        Find();
        if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
            left_num = numbers[i];
            answer.push_back('L');
        }
        else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
            right_num = numbers[i];
            answer.push_back('R');
        }
        else {
            for (int y = 0; y < 4; ++y) {
                for (int x = 0; x < 3; ++x) {
                    if (numbers[i] == keypad[y][x]) {
                        int dis_l = abs(x - left_x) + abs(y - left_y);
                        int dis_r = abs(x - right_x) + abs(y - right_y);
                        if (dis_l == dis_r) {
                            if (hand[0] == 'l') {
                                left_num = numbers[i];
                                answer.push_back('L');
                            }
                            else {
                                right_num = numbers[i];
                                answer.push_back('R');
                            }
                        }
                        else if (dis_l > dis_r) {
                            right_num = numbers[i];
                            answer.push_back('R');
                        }
                        else {
                            left_num = numbers[i];
                            answer.push_back('L');
                        }
                        break;
                    }
                }
            }
        }
    }
    return answer;
}