티스토리 뷰

알고리즘

[프로그래머스/c++] 키패드 누르기

개발기록 :) 2022. 8. 24. 20:50

성공 코드(내 코드)

1 2 3
4 5 6
7 8 9
* -> 10으로 두고 푼다. 0 -> 11로 두고 푼다. # -> 12로 두고 푼다.

 

  • 누르는 번호가
    • 1, 4, 7 -> L
    • 3, 6, 9 -> R
    • 이외에는 현재 왼손이 누르고 있는 번호의 위치와 오른손이 누르고 있는 번호의 위치를 통해 더 가까운 손으로 누른다. 거리가 같은 경우 왼손잡이면 왼손으로 오른손잡이면 오른손으로 누른다.
      • 누르고자 하는 번호와 현재 왼쪽/오른쪽 손이 누르고 있는 번호의 위치 사이의 거리를 측정하기 위해 distance 함수를 사용한다.
        • 매개변수: 누르고자 하는 번호(num), 현재 누르고 있는 번호(now), 어느쪽 손인지(hand)
        • now가 중간 줄에 있는 번호인 2, 5, 8, 11이 아니면 
          • 오른손인 경우 오른쪽 줄에 있는 번호를 누르고 있으므로 num을 1증가시킨다. 그리고 한 칸 이동했으므로 cnt를 1 증가시킨다.
          • 왼손이 경우 왼쪽 줄에 있는 번호를 누르고 있으므로 num을 1감소시킨다. 그리고 한 칸 이동했으므로 cnt를 1증가시킨다.
        • now와 num이 같아질때 까지 num을 이동한다.
          • now가 num보다 큰 경우 num이 아래의 줄로 가도록 +3 해준다.
          • now가 num보다 작은 경우 num이 위의 줄로 가도록 -3 해준다.
#include <string>
#include <vector>

using namespace std;

int distance(int num, int now, string hand){
    int cnt=0;
    if(now!=2 && now!=5 && now!=8 && now!=11){
        if(hand=="R"){
            num++;
        } else{
            num--;
        }
        cnt++;
    }
    while(1){
        if(now==num){
            break;
        } else if(now>num){
            num+=3;
        } else{
            num-=3;
        }
        cnt++;
    }
    
    return cnt;
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int l=10, r=12;
    
    for(int i=0; i<numbers.size(); i++){
        int num=numbers[i];
        if(num==0){
            num=11;
        }
        if(num==1 || num==4 || num==7){
            answer+="L";
            l=num;
        } else if(num==3 || num==6 || num==9){
            answer+="R";
            r=num;
        } else{
            if(distance(num, l, "L")>distance(num, r, "R")){
                answer+="R";
                r=num;
            } else if(distance(num, l, "L")<distance(num, r, "R")){
                answer+="L";
                l=num;
            } else{
                if(hand=="right"){
                    answer+="R";
                    r=num;
                } else{
                    answer+="L";
                    l=num;
                }
            }
        }
    }
    
    return answer;
}

 


다른 사람 풀이

전체적으로 푸는 흐름은 같으나,
번호가 있는 줄의 위치를 해당 번호를 3으로 나누어 생기는 나머지를 통해 파악하였으며
위의 distance 함수를 수식화 하여 풀었다.

 

  • 누르는 번호가
    • 1, 4, 7 -> 3으로 나누면 나머지가 1이면 L
    • 3, 6, 9 -> 3으로 나누면 나머지가 0이면 R
    • 이외에는 현재 왼손이 누르고 있는 번호의 위치와 오른손이 누르고 있는 번호의 위치를 통해 더 가까운 손으로 누른다. 거리가 같은 경우 왼손잡이면 왼손으로 오른손잡이면 오른손으로 누른다.
      • 누르고자 하는 번호와 현재 왼쪽/오른쪽 손이 누르고 있는 번호의 위치 사이의 거리를 측정하기 위해 다음과 같은 식을 사용한다.
        •  
if(curr_L % 3 == 1) dist_L = abs(tmp - curr_L - 1) / 3 + 1;
else dist_L = abs(tmp - curr_L) / 3;

if(curr_R % 3 == 0) dist_R= abs(tmp - curr_R + 1) / 3 + 1;
else dist_R = abs(tmp - curr_R) / 3;
#include <string>
#include <vector>
#include <math.h>

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";

    int curr_L = 10;
    int curr_R = 12;
    for(int i = 0; i < numbers.size(); i++) {
        if(numbers[i] % 3 == 1) {
            answer += "L";
            curr_L = numbers[i];
        }
        else if(numbers[i] % 3 == 0 && numbers[i] != 0) {
            answer += "R";
            curr_R = numbers[i];
        }
        else {
            int tmp = numbers[i];
            if(numbers[i] == 0) tmp = 11;

            int dist_L, dist_R;

            if(curr_L % 3 == 1) dist_L = abs(tmp - curr_L - 1) / 3 + 1;
            else dist_L = abs(tmp - curr_L) / 3;

            if(curr_R % 3 == 0) dist_R= abs(tmp - curr_R + 1) / 3 + 1;
            else dist_R = abs(tmp - curr_R) / 3;

            if(dist_L == dist_R) {
                if(hand[0] == 'l') {
                    answer += "L";
                    curr_L = tmp;
                }
                else {
                    answer += "R";
                    curr_R = tmp;
                }
            }
            else {
                if(dist_L < dist_R) {
                    answer += "L";
                    curr_L = tmp;
                }
                else {
                    answer += "R";
                    curr_R = tmp;
                }
            }
        }
    }
    return answer;
}