본문 바로가기
알고리즘/프로그래머스

[ 프로그래머스 / 구현 ] 키패드 누르기 (2020 카카오 인턴십)

by 뎁꼼 2020. 7. 25.

1. 문제


 

 

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

[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

 

 

2. 소스코드


- 왼손을 쓸지 오른손을 쓸지 결정해야되는 숫자만 제대로 구현해주면 된다. 2, 5, 8, 0

- 거리는 그냥 두 점의 x값 끼리, y값 끼리 좌표값을 빼주고 절대값을 취해서 더해주면 된다.

- bool 변수를 두어 마지막에 left, right 결과를 처리해주는 것이 더 깔끔.

 

소스코드

#include <string>
#include <vector>
#define COL 4
#define ROW 3
using namespace std;

pair<int, int> Lpos = { 3,0 }, Rpos = { 3,2 };
int keypad[4][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9},
    {-1,0,-1}
};
pair<int, int> getPos(int num) {
    for (int i = 0; i < COL; ++i) {
        for (int j = 0; j < ROW; ++j) {
            if (keypad[i][j] == num)
                return { i,j };
        }
    }
}

int findDist(const pair<int, int>& pos, const int& num) {
    pair<int, int> numPos = getPos(num);
    return abs((pos.first - numPos.first)) + abs((pos.second - numPos.second));
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int size = numbers.size();
    // 입력할 숫자를 순회
    for (int i = 0; i < size; ++i) {
        // 오른손이 기본값
        bool left = false;
        // 현재 숫자를 저장
        int cur = numbers[i];
        // 무조건 왼손을 쓰는 경우
        if (cur == 1 or cur == 4 or cur == 7)
            left = true;
        // 무조건 오른손을 쓰는 경우
        else if (cur == 3 or cur == 6 or cur == 9);
        // 거리와 주 손에 따라 달라지는 경우
        else {
            // 거리를 구하고 비교한다.
            int Ldist = findDist(Lpos, cur);
            int Rdist = findDist(Rpos, cur);
            // 왼손이 더 먼 경우 - 오른손 사용
            if (Ldist > Rdist);
            // 오른손이 더 먼 경우 - 왼손 사용
            else if (Rdist > Ldist) left = true;
            // 거리가 같은 경우 - 주 손 사용
            else if (Rdist == Ldist)
                if (hand == "left") left = true;
        }
        // 결과에 따라 정답에 추가해준다.
        if (left) answer += 'L', Lpos = getPos(cur);
        else answer += 'R', Rpos = getPos(cur);
    }
    return answer;
}