카카오 2020 인턴십 : 키패드 누르기

phoenixKim·2021년 9월 7일
0

카카오 기출문제

목록 보기
13/24

몇번 풀어봄

  • 21년 10월 7일 목요일

풀이전략

  • 거리값에 따라서 어떤 손꾸락으로 누를지를 결정하는 것이다.

  • 고정되어 있는 값이므로 좌표를 사용하면 될것 같다고 판단함.

  • pair<int,int> 이런식으로 그리고 숫자 0,1,2,3,4,5,6,7,8,9 는
    중복되는 값이 없으므로 mapping 해야 겠다고 판단함.

  • map<int, pair<int,int>>m;으로 해서 번호에 따른 좌표값을 설정함.

  • 왼손 엄지의 위치와 오른손엄지의 좌표값을 이용해야 겠다고 판단했다. 왜냐하면 거리비교를 해야 하므로, 그래서 변수 두개 선언함.

  • 거리값 비교할때는 가운데의 번호 2,5,8,0 일때만 거리 비교를 한다.

  • 거리가 같다면 오른손잡이인지 왼손 잡이인지 확인해서 진행함.

소스코드

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

string solution(vector<int> numbers, string hand) {
    
    
    unordered_map<int, pair<int,int>>m;
    
    m.insert({0, {3,1}});
    m.insert({1, {0,0}});
    m.insert({2, {0,1}});
    m.insert({3, {0,2}});
    m.insert({4, {1,0}});
    m.insert({5, {1,1}});
    m.insert({6, {1,2}});
    m.insert({7, {2,0}});
    m.insert({8, {2,1}});
    m.insert({9, {2,2}});
    
    
    pair<int,int>leftPos ={3,0};
    pair<int,int>rightPos = {3,2};
    
    string answer = "";
    
    for(int i = 0; i< numbers.size(); i++)
    {
        pair<int,int>target = m[numbers[i]];
        
        //엄지 위치 갱신해야 한다.
        
        //왼손 엄지
        if(numbers[i] == 1 || numbers[i] == 4 
          || numbers[i] == 7)
        {
            leftPos = m[numbers[i]];
            answer += "L";
        }
        //오른손 엄지
        else if(numbers[i] == 3 || numbers[i] == 6 
          || numbers[i] == 9)
        {
            rightPos = m[numbers[i]];
            answer += "R";
        }
        //가운데 값일 경우에는 dist 값 구해서 작은 값으로 갱신해야 한다.
        else
        {
            //왼손의 좌표와 타겟의 좌표 vs 오른손의 좌표와 타겟의 좌표 비교
            int distRight = abs(target.first - rightPos.first) 
                + abs(target.second - rightPos.second);
            int distLeft = abs(target.first - leftPos.first) 
                + abs(target.second - leftPos.second);
            
            //오른손 엄지가 왼손 엄지보다 가깝다.
            if(distRight < distLeft)
            {
                rightPos = m[numbers[i]];
                answer += "R";
            }
            else if(distRight > distLeft)
            {
                leftPos = m[numbers[i]];
                answer += "L";
            }
            //오른손 잡이인지, 왼손잡이인지 확인
            else if(distRight == distLeft)
            {
                if(hand == "left")
                {
                    leftPos = m[numbers[i]];
                    answer += "L";
                }
                else if(hand == "right")
                {
                    rightPos = m[numbers[i]];
                    answer += "R";
                }
            }
            
        }
        
       
       
    }
    
    
    
    return answer;
}

profile
🔥🔥🔥

0개의 댓글

관련 채용 정보