[프로그래머스/C++]Lv.1 - 키패드 누르기

YH J·2023년 5월 22일
0

프로그래머스

목록 보기
91/168

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/67256

내 풀이

일단 입력이 147인 경우, 369인 경우는 바로 처리한다.
나머지 2580인 경우에 현재 왼손과 오른손의 위치를 바탕으로 거리를 계산하여 비교하여 처리한다.

내 코드

#include <string>
#include <vector>

using namespace std;

int cal(const int& number, const int& inNum)
{
    int n = abs(number - inNum);
    if(n == 0)
        return 0;
    else if(n == 1 || n == 3)
        return 1;
    else if(n == 2 || n == 4 || n == 6)
        return 2;
    else if(n == 7 || n == 5 || n == 9)
        return 3;
    else if(n == 10 || n == 8)
        return 4;
    
}


string solution(vector<int> numbers, string hand) {
    string answer = "";
    int right = 10;
    int left = 12;
    
    for(int n : numbers)
    {
        // 0을 11로 치환
        if(n == 0) n = 11;
        // 1, 4, 7 일 경우 무조건 L
        if(n == 1 || n == 4 || n == 7)
        {
            answer += 'L';
            left = n;
        }
        // 3, 6, 9 일 경우 무조건 R
        else if(n == 3 || n == 6 || n == 9)
        {
            answer += 'R';
            right = n;
        }
        // 2, 5, 8, 11 일 경우
        else
        {
            int l = cal(n, left);
            int r = cal(n, right);
            // 같은 거리일 경우
            if(l==r)
            {
                if(hand == "right")
                {
                    answer += 'R';
                    right = n;
                }
                else
                {
                    answer += 'L';
                    left = n;
                }
            }
            else if(l > r)
            {
                answer += 'R';
                right = n;
            }
            else
            {
                answer += 'L';
                left = n;
            }
        }
    }
    return answer;
}

다른 사람의 풀이

#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;
}

다른 사람의 풀이 해석

거리를 계산해줄 때 공식을 사용하였다.

profile
게임 개발자 지망생

0개의 댓글