본문 바로가기
알고리즘/프로그래머스

프로그래머스 2020년 카카오 인턴십 키패드 누르기 Level1

by 개발자J의일상 2022. 6. 24.
반응형

Level 1 치고는 꽤 까다로운 문제여서 놀랐다.

구현 방법에는 3가지가 있을 것 같다.

 

  1. map에 숫자별로 0, 8, 5, 2 간의 거리를 저장해 놓고 불러오는 식으로 구현
  2. 위치정보를 좌표로 저장하여 *의 경우 (1,4)로 설정하고 #를 (4,4)로 설정하여 abs로 x좌표와 y좌표의 거리를 계산하여도 된다. 숫자들의 좌표 정보를 배열로 가지고 있으면 된다.
  3. DFS? 이건 좀 복잡할 것 같아서 Pass

내가 푼 풀이는 1번으로 여기서 핵심은 find이고 매번 L, R가 선택될 때 마다 해당 하는 손의 위치를 업데이트 해줘야 한다.

#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

string solution(vector<int> numbers, string hand) {
    map<pair<string, int>, int> position_diff_map = 
    {
        {make_pair("*",0), 1},
        {make_pair("*",8), 2},
        {make_pair("*",5), 3},
        {make_pair("*",2), 4},
        {make_pair("7",0), 2},
        {make_pair("7",8), 1},
        {make_pair("7",5), 2},
        {make_pair("7",2), 3},
        {make_pair("4",0), 3},
        {make_pair("4",8), 2},
        {make_pair("4",5), 1},
        {make_pair("4",2), 2},
        {make_pair("1",0), 4},
        {make_pair("1",8), 3},
        {make_pair("1",5), 2},
        {make_pair("1",2), 1},
        
        {make_pair("#",0), 1},
        {make_pair("#",8), 2},
        {make_pair("#",5), 3},
        {make_pair("#",2), 4},
        {make_pair("9",0), 2},
        {make_pair("9",8), 1},
        {make_pair("9",5), 2},
        {make_pair("9",2), 3},
        {make_pair("6",0), 3},
        {make_pair("6",8), 2},
        {make_pair("6",5), 1},
        {make_pair("6",2), 2},
        {make_pair("3",0), 4},
        {make_pair("3",8), 3},
        {make_pair("3",5), 2},
        {make_pair("3",2), 1},
        
        {make_pair("0",0), 0},
        {make_pair("0",8), 1},
        {make_pair("0",5), 2},
        {make_pair("0",2), 3},
        {make_pair("8",0), 1},
        {make_pair("8",8), 0},
        {make_pair("8",5), 1},
        {make_pair("8",2), 2},
        {make_pair("5",0), 2},
        {make_pair("5",8), 1},
        {make_pair("5",5), 0},
        {make_pair("5",2), 1},
        {make_pair("2",0), 3},
        {make_pair("2",8), 2},
        {make_pair("2",5), 1},
        {make_pair("2",2), 0},
    };

    string answer = "";
    string left_hand_pos = "*";
    string right_hand_pos = "#";
    for (auto i = 0; i < numbers.size(); i++)
    {
        if (numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7) {
            answer += 'L';
            left_hand_pos =  to_string(numbers[i]);
        }
        else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9)
        {
            answer += 'R';
            right_hand_pos = to_string(numbers[i]);
        }
        else if (numbers[i] == 2 || numbers[i] == 5 || numbers[i] == 8 || numbers[i] == 0)
        {
            //left_hand_pos와 right_hand_pos의 차이가 가까운 곳을 누름
            auto from_left_hand = position_diff_map.find(make_pair(left_hand_pos, numbers[i]));
            auto from_right_hand = position_diff_map.find(make_pair(right_hand_pos, numbers[i]));
            if (from_left_hand->second == from_right_hand->second)
            {
                if(hand.compare("left") == 0)
                {
                    answer += 'L';
                    left_hand_pos = to_string(numbers[i]);
                }
                else 
                {   
                    answer += 'R';
                    right_hand_pos = to_string(numbers[i]);
                }
            }
            else if (from_left_hand->second < from_right_hand->second)
            {
                answer += "L";
                left_hand_pos = to_string(numbers[i]);
            }
            else
            {
                answer += "R";
                right_hand_pos = to_string(numbers[i]);
            }
        }
    }
    return answer;
}

 

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

댓글