알고리즘/프로그래머스 1단계

프로그래머스 - 키패드 누르기 - C++

게임만드는학생 2024. 7. 25. 15:45

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>
#include <map>
#include <cstdlib>
using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int posL=11,posR=12;
    
    map<int,pair<int,int>> m;
    m.insert({0,{3,1}});
    m.insert({11,{3,0}});
    m.insert({12,{3,2}});
    int num=0;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            m.insert({++num,make_pair(i,j)});
    
    for(int i=0;i<numbers.size();i++)
    {
        if(numbers[i]==1||numbers[i]==4||numbers[i]==7)
        {
            posL=numbers[i];
            answer+="L";
        }
        else if(numbers[i]==3||numbers[i]==6||numbers[i]==9)
        {
            posR=numbers[i];
            answer+="R";
        }
        else
        {
            int a = abs(m[numbers[i]].first-m[posL].first) + 
                abs(m[numbers[i]].second-m[posL].second);
            int b = abs(m[numbers[i]].first-m[posR].first) + 
                abs(m[numbers[i]].second-m[posR].second);
            
            if(a<b)
            {
                answer+="L";
                posL = numbers[i];
            }
            else if(a==b)
            {
                if(hand=="left")
                {
                    answer+="L";
                    posL = numbers[i];
                }
                else
                {
                    answer+="R";
                    posR = numbers[i];
                }
            }
            else
            {
                answer+="R";
                posR = numbers[i];
            }
        }
    }
    
    return answer;
}

키패드의 번호와 좌표를 map에 저장하였다. 

 

for문을 돌며 1,4,7 그리고 3,6,9에서는 각각 L,R을 추가하며

2,5,8,0 에서는 거리를 계산한다. 

 

map에 저장한 좌표를 기준으로 거리를 계산하여 가까운 손으로 누르게한다.