스터디/알고리즘 문제풀이

[C++] Programmers 2020 카카오 인턴십 - 키패드 누르기

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

 

 

Level 1로 크게 어렵지는 않은 난이도의 구현 문제입니다.

 

위와 같은 그림으로 핸드폰 키패드가 있을 때, 손가락의 최소 이동 거리우선순위(왼손잡이 또는 오른손잡이)를 고려하여 입력으로 주어진 numbers의 번호들을 누르기 위해 어떤 손의 손가락을 사용해야 하는지 출력하는 문제입니다. 

 

핸드폰 키패드의 번호가 많아봤자 12개이기 때문에 키패드의 좌표를 미리 설정해 주는것이 핵심입니다.

0~9까지 번호 위치를 배열의 인덱스와 맞게 설정해주고, 입력이 '2', '5', '8', '0'일 때 이 배열을 사용해 현재 양 손가락에서의 거리를 구합니다. 이때 더 짧은 거리를 선택하여 손가락을 움직입니다. 

 

#include <string>
#include <vector>
#include<iostream>
using namespace std;

int button_position[13][3] = {{3,1},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2},{3,0},{3,2}};

int getDist(int x,int y)
{
    int a = abs(button_position[x][0] - button_position[y][0]);
    int b = abs(button_position[x][1] - button_position[y][1]);

    return a+b;
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int left = 10;
    int right = 11;
    
    for(int i=0;i<numbers.size();i++)
    {
        int n = numbers[i];
        
        if(n==1 || n==4 || n==7)
        //왼손 사용
        {
            answer += 'L';
            left = n;
        }
        else if(n==3 || n==6 ||n==9)	
        //오른손 사용
        {
            answer += 'R';
            right = n;
        }
        else	//2, 5, 8, 0
        {
            int r_dist = getDist(n,right);
            int l_dist = getDist(n,left);
            if(r_dist==l_dist)
            //거리가 같으면 우선순위 고려, 아니라면 더 짧은 이동 거리의 손가락 사용
            {
                if(hand=="right")
                {
                    answer += 'R';
                    right = n;
                }
                else
                {
                    answer += 'L';
                    left = n;
                }
            }
            else if(r_dist<l_dist)
            {
                answer += 'R';
                right = n;
            }
            else
            {
                answer += 'L';
                left = n;
            }
        }
    }
    
    return answer;
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	vector<int> v1 = {1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5};
	cout<<solution(v1,"right")<<"\n";
	vector<int> v2 = {7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2};
	cout<<solution(v2,"left")<<"\n";
	
	return 0;
}