이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

코딩테스트

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

이쿠우우 2022. 3. 15. 20:20
반응형

 

 

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

 

글쓴이의 답

개인적인 풀이 임으로

이것보다 더 좋은 알고리즘은 많음...

이렇게도 풀이하는구나.. 공유하기 위해 올림...

 

#include <string>
#include <vector>

using namespace std;

vector<int> location(int num){
    vector<int> result;
    if(1 == num){
        result.push_back(0);
        result.push_back(0);
    }
    else if(2 == num){
        result.push_back(0);
        result.push_back(1);
    }
    else if(3 == num){
        result.push_back(0);
        result.push_back(2);
    }
    else if(4 == num){
        result.push_back(1);
        result.push_back(0);
    }
    else if(5 == num){
        result.push_back(1);
        result.push_back(1);
    }
    else if(6 == num){
        result.push_back(1);
        result.push_back(2);
    }
    else if(7 == num){
        result.push_back(2);
        result.push_back(0);
    }
    else if(8 == num){
        result.push_back(2);
        result.push_back(1);
    }
    else if(9 == num){
        result.push_back(2);
        result.push_back(2);
    }
    else if(0 == num){
        result.push_back(3);
        result.push_back(1);
    }
    
    return result;
}

string middle(int num, vector<int> left, vector<int> right, string hand){
    string result = "";
    vector<int> targetLocation = location(num);
    
    int resultL = 0;
    int resultR = 0;
    
    int tempL = left[0] - targetLocation[0];
    if (tempL < 0){
        tempL *= -1;
    }
    resultL = tempL;
    tempL = left[1] - targetLocation[1];
    if (tempL < 0){
        tempL *= -1;
    }
    resultL += tempL;
    
    int tempR = right[0] - targetLocation[0];
    if (tempR < 0){
        tempR *= -1;
    }
    resultR = tempR;
    tempR = right[1] - targetLocation[1];
    if (tempR < 0){
        tempR *= -1;
    }
    resultR += tempR;
    
    if(resultR == resultL){
        if ("right" == hand){
            result = "R";
        }
        else{
            result = "L";
        }
    }
    else if(resultR > resultL){
        result = "L";
    }
    else if(resultR < resultL){
        result = "R";
    }
    
    return result;
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    vector<int> left = {3,0};
    vector<int> right = {3,2};
    for(int i=0; i< numbers.size(); i++){
        int target = numbers[i];
        if((1 == target) || (4 == target) || (7 == target)){
            answer += "L";
            left = location(target);
        }
        else if((3 == target) || (6 == target) || (9 == target)){
            answer += "R";
            right = location(target);
        }
        else{
            string middleResult = middle(target, left, right, hand);
            answer += middleResult;
            if ("L" == middleResult){
                left = location(target);
            }
            else{
                right = location(target);
            }
        }                             
    }
    
    return answer;
}

 

꾸준히 하다보면 실력이 늘겠지.

반응형