본문 바로가기

Algorithm/Implementation

(C++) - 프로그래머스(2020 카카오 인턴십) : 키패드 누르기

반응형

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

구현문제였습니다.

 

📕 풀이방법

📔 풀이과정

누른 번호목록이 저장되어 있는 numbers를 순회하며 답 변수 answer에 적절히 답 문자들을 뒤에 붙여주는 방식으로 구현했습니다.  1. 1, 4, 7의 경우는 왼손  2. 3, 6, 9의 경우 오른손 3. 나머지의 경우 현재 각 손가락의 위치부터 누르는 곳까지의 맨해튼 거리를 비교해 더 가까운 쪽으로 누릅니다. 거리가 같은 경우에는 hand에 따라 누릅니다. 

 

1 ~ 3 번 과정을 수행한 후에는 누른 손의 위치를 변경해줘야합니다.

 

📔 정답출력

answer를 반환합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
//왼손 (3,0), 오른손 (3,2) 시작
vector <vector<int>> pad = {
    {1,2,3},
    {4,5,6},
    {7,8,9},
    {-1,0,-2},
};

struct Coord {int r, c;} leftThumb, rightThumb;

int getDist(Coord origin, Coord thumb){
    return abs(thumb.r - origin.r) + abs(thumb.c - origin.c);
}

Coord getCoord(int num){
    for(int i = 0; i < pad.size(); i++){
        for(int j = 0; j < pad[i].size(); j++){
            if(pad[i][j] == num) return {i, j};
        }
    }
    return {0, 0};
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    leftThumb = {3,0};
    rightThumb = {3,2};
    for(auto n : numbers){
        if(n == 1 || n == 4 || n == 7) {
            answer += 'L';
            leftThumb = getCoord(n);
        }
        else if(n == 3 || n == 6 || n == 9) {
            answer += 'R';
            rightThumb = getCoord(n);
        }
        else{
            Coord tmp = getCoord(n);
            int ldist = getDist(tmp, leftThumb);
            int rdist = getDist(tmp, rightThumb);
            if(ldist == rdist){
                if(hand == "right") {
                    answer += 'R';
                    rightThumb = getCoord(n);
                }
                else {
                    leftThumb = getCoord(n);
                    answer += 'L';
                }
            }
            else{
                if(ldist < rdist) {
                    answer += 'L';
                    leftThumb = getCoord(n);
                }
                else {
                    rightThumb = getCoord(n);
                    answer += 'R';
                }
            }
        }
    }
    return answer;
}