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

김개발·2021년 9월 4일
0

프로그래머스

목록 보기
3/42

문제 푼 날짜 : 2021-09-01

문제

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/67256

접근 및 풀이

키패드를 4x3 배열로 생각하고, 키패드의 위치정보를 vector를 통해 관리한다.(인덱스 순서대로 0~9까지 숫자만 저장)
처음 왼엄지와 오른엄지의 위치를 각각 (3, 0), (3, 2)로 설정해주고, 주어진 다이얼을 누를 때마다 숫자가 1, 4, 7이면 왼엄지를 이용하도록 하고, 3, 6, 9이면 오른엄지를 이용하도록 하고 그 위치로 사용한 엄지의 위치를 업데이트 해준다.
그 외의 숫자이면 왼엄지와 오른엄지와의 거리를 구해주어 어떤 엄지를 사용할지 정해주었다.
이 때, 거리가 같다면 주로 쓰는 손을 체크하여 정해준다.

코드

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int getDist(pair<int, int> h, pair<int, int> n) {
    return abs(n.first - h.first) + abs(n.second - h.second);
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    vector<pair<int, int>> v[10];
    
    v[0].push_back(make_pair(3, 1));
    int dial = 1;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            v[dial++].push_back(make_pair(i, j));
        }
    }

    pair<int, int> lpos = { 3, 0 };
    pair<int, int> rpos = { 3, 2 };
    for (int i = 0; i < numbers.size(); i++) {
        int num = numbers[i];
        pair<int, int> npos = make_pair(v[num].front().first, v[num].front().second);
        
        if (num == 1 || num == 4 || num == 7) {
            answer += "L";
            lpos = npos;
        } else if (num == 3 || num == 6 || num == 9) {
            answer += "R";
            rpos = npos;
        } else {
            int ldiff = getDist(lpos, npos);
            int rdiff = getDist(rpos, npos);
            if (ldiff < rdiff) {
                answer += "L";
                lpos = npos;
            } else if (ldiff > rdiff) {
                answer += "R";
                rpos = npos;
            } else {
                if (hand.compare("right") == 0) {
                    answer += "R";
                    rpos = npos;
                } else {
                    answer += "L";
                    lpos = npos;
                }
            }
        }
    }
    
    return answer;
}

결과

피드백

조건대로 구현해주면 쉽게 풀 수 있는 문제였다.
이런 문제는 좀 더 빠르고 정확하게 읽고, 신속하게 구현할 수 있도록 연습해야겠다.

profile
개발을 잘하고 싶은 사람

0개의 댓글