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
#include <string>
#include <vector>
#include <unordered_map>
#include <cmath>
using namespace std;
struct pos {
    int x, y;
};
// 0 ~ 9 까지의 숫자 위치 매기기
void set_pos(unordered_map<int, pos> &m)
{
    int key = 0;
    m[key++] = {3, 1};
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            m[key++] = {i, j};
        }
    }
}
string solution(vector<int> numbers, string hand) {
    // 0 ~ 9까지의 숫자 위치맵 생성
    unordered_map<int, pos> pos_map;
    set_pos(pos_map);
    // 왼손 오른손 시작 위치
    pos hand_L = { 3, 0 };
    pos hand_R = { 3, 2 };
    string answer = "";
    for (int i = 0; i < numbers.size(); ++i)
    {
        char c;
        int num = numbers[i];
        // 왼손 영역
        if (num == 1 || num == 4 || num == 7)
        {
            hand_L = pos_map[num];
            c = 'L';
        }
        // 오른손 영역
        else if (num == 3 || num == 6 || num == 9)
        {
            hand_R = pos_map[num];
            c = 'R';
        }
        // 가운데
        else
        {
            // 각 숫자 위치와 왼손/오른손 위치의 거리 구하기
            pos p_num = pos_map[num];
            int dist_R = abs(p_num.x - hand_R.x) + abs(p_num.y - hand_R.y);
            int dist_L = abs(p_num.x - hand_L.x) + abs(p_num.y - hand_L.y);
            // 왼손이 더 가깝거나 왼손/오른손 거리가 같은데 왼손잡이일 때
            if (dist_R > dist_L || (dist_L == dist_R && hand.compare("left") == 0))
            {
                hand_L = p_num;
                c = 'L';
            }
            // 오른손이 더 가깝거나 왼손/오른손 거리가 같은데 오른손잡이일 때
            else if (dist_R < dist_L || (dist_L == dist_R && hand.compare("right") == 0))
            {
                hand_R = p_num;
                c = 'R';
            }
        }
        // 문자 더해주기
        answer += c;
    }
    return answer;
}
이 문제를 실제 코테에서 접했더라면 괜히 첫인상에 겁먹었을 것 같다.
하지만 잘 읽어보면 정말 간단한 구현 문제이다.
여기에 map으로 숫자들의 위치를 저장한다는 아이디어를 활용하면
상대적으로 간단한 코드로 문제를 풀 수 있다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [프로그래머스]연습문제 : 야근 지수 (level 3) (c++) (0) | 2020.07.08 | 
|---|---|
| [프로그래머스]2020 카카오 인턴십 : 수식 최대화 (level 2) (c++) (0) | 2020.07.07 | 
| [프로그래머스]2020 KAKAO BLIND RECRUITMENT : 문자열 압축 (level 2)(c++) (0) | 2020.07.06 | 
| [프로그래머스]연습문제 : 멀리 뛰기 (level 3)(c++) (0) | 2020.07.06 | 
| [프로그래머스]2017 카카오코드 본선 : GPS (level 3) (c++) (0) | 2020.07.05 | 
댓글