본문 바로가기
알고리즘 문제

[알고리즘문제] 프로그래머스 - 키패드 누르기

by 박연호의 개발 블로그 2020. 9. 22.

문제의 핵심은 번호의 위치를 좌표로 어떻게 표혈한 것인가 ? 이다. 그 이후의 다른 부분은 그냥 문제를 읽고 if문으로 처리해주면 된다. 

y위치는 num/3을 해주고, x위치는 0번째 인덱스 부터 시작하기 때문에 num%3 -1을 해준다.

 

그리고 제일 오른쪽 번호(3,6,9)에서 처리를 해주어야 하는데 3,6,9에서는 num%3값이 0이 되기 때문에 임의로 2를 넣어주어여 하며, y위치 역시 y위치로 +1값이 되기 때문에 -1을 해주어야 한다. 그 외부분은 문제의 설명대로 구하면 된다.

 

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

using namespace std;

int distance(int x1, int y1, int x2, int y2) // 두 점의 거리
{
    return abs(x2 - x1) + abs(y2 - y1);
}
string solution(vector<int> numbers, string hand)
{
    string answer = "";

    int leftX = 0;
    int leftY = 3;
    int rightX = 2;
    int rightY = 3;

    int curX, curY;
    for (int i = 0; i < numbers.size(); i++)
    {
        int num = numbers[i];
        int curY = num / 3;
        int curX = (num % 3) - 1;

        if (num % 3 == 0)
        {
            curY--;
            curX = 2;
        }

        if (num == 0)
        {
            curY = 3;
            curX = 1;
        }

        if (num == 1 || num == 4 || num == 7)
        {
            leftX = curX;
            leftY = curY;
            answer += "L";
            continue;
        }
        else if (num == 3 || num == 6 || num == 9)
        {
            rightX = curX;
            rightY = curY;
            answer += "R";
            continue;
        }

        int leftDistance = distance(leftX, leftY, curX, curY);
        int rightDistance = distance(rightX, rightY, curX, curY);

        if (leftDistance < rightDistance)
        { // 왼쪽이 더 짧은 경우
            leftX = curX;
            leftY = curY;
            answer += "L";
        }
        else if (rightDistance < leftDistance)
        { // 오른쪽이 더 짧은경우
            rightX = curX;
            rightY = curY;
            answer += "R";
        }
        else
        { // 길이가 같은 경우
            if (hand == "left")
            {
                leftX = curX;
                leftY = curY;
                answer += "L";
            }
            else
            {
                rightX = curX;
                rightY = curY;
                answer += "R";
            }
        }
    }

    cout << answer << endl;
    return answer;
}