[C++로 풀이] 키패드 누르기⭐

Date:     Updated:

카테고리:

태그:

📌 키패드 누르기

난이도 ⭐

🚀 문제

image

image


🚀 내 풀이 ⭕

#include <string>
#include <vector>

using namespace std;

int abs(int n)
{
    if (n < 0) return -n;
    else return n;
}

int distance(int pos, int dest)
{
    int dist = 0;

    dist += abs((pos - 1) / 3 - (dest - 1) / 3); // 행의 차이       
    dist += abs((pos - 1) % 3 - (dest - 1) % 3); // 열의 차이

    return dist;
}

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

    for(int i = 0; i < numbers.size(); i++)
    {
        int num = (numbers[i] != 0 ? numbers[i] : 11);
        
        if (num % 3 == 1)
        {
            left = num;
            answer.append("L");
        }
        else if (num % 3 == 0)
        {
            right = num;
            answer.append("R");
        }
        else
        {
            int left_dist = distance(left, num);
            int right_dist = distance(right, num);
            
            if (left_dist < right_dist)
            {
                left = num;
                answer.append("L");
            }
            else if (right_dist < left_dist)
            {
                right = num;
                answer.append("R");
            }
            else if (right_dist == left_dist)
            {
                if (hand == "left")
                {
                    left = num;
                    answer.append("L");
                }
                else if (hand == "right")
                {
                    right = num;
                    answer.append("R");
                }
            }   
        }
    }
    
    return answer;
}
  • left, right가 둘 중 하나라도 한번도 업데이트 되지 않는데 (2, 5, 8, 0)을 마주하여 가장 가까운 거리를 재야하는 상황이 올 수도 있으므로 left*10이라고 초기화 해놓고, right#을 고려하여 12이라고 초기화.
  • 키패드 거리 차이를 3으로 나눈 몫(행)과 3으로 나눈 나머지(열)를 더해 구할 것이므로 0 인 경우 이에 맞워 11이라고 간주.
  • 3으로 나눈 몫은 a > b인 경우 a의 몫이 더 크지만, 3으로 나눈 나머지는 ab의 크기 차이와 상관이 없다.
    • 100%3 은 1이지만 2%3 은 2이니 후자가 나머지는 더 큰 것 처럼.
1 2 3      1 2 3       0 1 2
4 5 6  ->  4 5 6   ->  3 4 5 
7 8 9      7 8 9       6 7 8
* 0 #     10 11 12     9 10 11
#include <string>
#include <vector>

using namespace std;

int abs(int n)
{
    if (n < 0) return -n;
    else return n;
}

int distance(int pos, int dest)
{
    int dist = 0;

    dist += abs((pos - 1) / 3 - (dest - 1) / 3);
    dist += abs((pos - 1) % 3 - (dest - 1) % 3);

    return dist;
}

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

    for(int i = 0; i < numbers.size(); i++)
    {
        int num = (numbers[i] != 0 ? numbers[i] : 11);
        int used; // 0 왼손, 1 오른손  
        
        if (num % 3 == 1)
            used = 0;

        else if (num % 3 == 0)
            used = 1;
        else
        {
            int left_dist = distance(left, num);
            int right_dist = distance(right, num);
            
            if (left_dist < right_dist)
                used = 0;
            else if (right_dist < left_dist)
                used = 1;
            else if (right_dist == left_dist)
            {
                if (hand == "left")
                    used = 0;
                else if (hand == "right")
                    used = 1;
            }   
        }
        
        switch(used)
        {
            case 0: 
                left = num;
                answer.append("L");
                break;
            case 1:
                right = num;
                answer.append("R");
                break;
        }
    }
    
    return answer;
}

switch문 사용하여 공통된 부분 빼기



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers 카테고리 내 다른 글 보러가기

댓글 남기기