N

(프로그래머스 c++ KAKAO)키패드 누르기 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)키패드 누르기

naeunchan 2020. 7. 2. 11:13
728x90
반응형

leftHand는 왼손의 현재 키패드 위치, rightHand는 오른손의 현재 키패드 위치,

leftDist는 numbers[i]와 현재 왼손 위치의 거리, rightDist는 numbers[i]와 현재 오른손 위치의 거리를 나타낸다.

맨 처음 왼손과 오른손은 *, #에 위치하기 때문에 각각 10, 12를 넣어준다.

 

이제 for문으로 numbers를 순회한다.

numbers[i]가 1, 4, 7이면 "L",

numbers[i]가 3, 6, 9이면 "R",

numbers[i]가 2, 5, 8, 0 이면 가까운 손으로 누르고, 거리가 같으면 주 손으로 누르면 된다.

만약 numbers[i] == 0인 경우, 11로 바꿔주어 왼손과 오른손과의 거리를 구한다.

tmp_l은 leftHand - numbers[i]의 절대값,

tmp_r은 rightHand - numbers[i]의 절대값을 저장한다.

 

이 두 값을 이용해 leftDist, rightDist를 구한다.

두 값이 같으면 주 손을 넣어주고,

아닌 경우 거리가 가까운 손을 넣어주면 된다..!

그리고 움직인 손의 위치를 바꿔주고 끝까지 순회하면 된다..!

 

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

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int leftHand = 10, rightHand = 12, leftDist = 0, rightDist = 0;
    
    for(int i = 0; i < numbers.size(); i++)
    {
        if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7)
        {
            answer += "L";
            leftHand = numbers[i];
        }
        else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9)
        {
            answer += "R";
            rightHand = numbers[i];
        }
        else
        {
            if(numbers[i] == 0)
                numbers[i] = 11;
            int tmp_l = abs(leftHand - numbers[i]);
            int tmp_r = abs(rightHand - numbers[i]);
            
            leftDist = (tmp_l / 3) + (tmp_l % 3);
            rightDist = (tmp_r / 3) + (tmp_r % 3);
            
            if(leftDist == rightDist)
            {
                if(hand == "right")
                {
                    answer += "R";
                    rightHand = numbers[i];
                }
                else
                {
                    answer += "L";
                    leftHand = numbers[i];
                }
            }
            else if(leftDist < rightDist)
            {
                answer += "L";
                leftHand = numbers[i];
            }
            else
            {
                answer += "R";
                rightHand = numbers[i];
            }
        }
    }
    return answer;
}
728x90
반응형