알고리즘 공부(C++)

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

혀니리리 2023. 6. 23. 16:43
728x90

코딩테스트 연습 - 키패드 누르기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

#include <string>
#include <vector>
#include <iostream>
#include <cmath>

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    vector<string> ans;
    vector<pair<int, int>> v[10];
    pair<int, int> l = {0, 3};
    pair<int, int> r = {2, 3};
    v[0].push_back({1,3});
    for (int i = 1; i <= 9; i++)
        v[i].push_back({(i + 2) % 3, (i - 1) / 3}); //배열 위치 초기화
    for(int i = 0; i < numbers.size(); i++)
    {
        if(numbers[i] % 3 == 1)
            answer.push_back('L');
        else if(numbers[i] % 3 == 0 && numbers[i] != 0)
            answer.push_back('R');
        else
        {
            if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)>abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
                answer.push_back('R');
            else if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)<abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
                answer.push_back('L');
            else if(abs(v[numbers[i]][0].first - l.first)+abs(v[numbers[i]][0].second - l.second)==abs(v[numbers[i]][0].first - r.first)+abs(v[numbers[i]][0].second - r.second))
            {
                if (hand == "right")
                    answer.push_back('R');
                else if(hand == "left")
                    answer.push_back('L');
            }
        }
        if(answer.back() == 'L')
            l = v[numbers[i]][0];
        else if(answer.back() == 'R')
            r = v[numbers[i]][0];
    }
    return answer;
}

문제 풀이 방식

1.키패드의 위치를 좌표로 초기화하여 vector<pair<int, int>>에 할당해줌

1
{0,0}
2
{1,0}
3
{2,0}
4
{0,1}
5
{1,1}
6
{2,1}
7
{0,2}
8
{1,2}
9
{2,2}
*
{0,3}
0
{1,3}
#
{2,3}

이런 식으로 임의의 값을 설정하고 초기화해준다.

왼손, 오른손의 현재 좌표 위치는 항상 다시 설정해줘야 하는 값이므로 따로 l,r이라는 이름의 pair<int,int>형으로 선언해주고 각각 *, #의 위치로 초기화해준다.

 

2.numbers배열을 for문으로 돌며, 1,4,7에 속하면 L을, 3,6,9에 속하면 R을 answer에 push_back해준다.

 

3.2,5,8,0에 해당하는 경우 number의 위치가 L,R중 어떤 것이 가까운지 절댓값을 통해 따져서 (상하좌우로만 이동할 수 있기 때문) answer에 push_back해준다.

 

4.2,5,8,0과 l,r의 거리가 같을 경우 hand가 right인지 left인지 따져준다.

 

5.매 for문마다 answer삽입이 끝나면 l,r의 좌표 상태도 바꿔준다.

 

*알아두면 좋은 상식

1.string도 vector처럼 push_back가능. 단, 넣을 수 있는 요소는 char형

2.answer.back() =>string의 가장 끝문자 알 수 있음.

728x90