티스토리 뷰

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

4행 3열 키패드에 0~ 12까지 수가 있다고 가정하고 숫자별 위치를 미리 저장하여 풀이하였습니다.


C++ 소스 코드

#include <string>
#include <vector>
#include <cmath>
using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    if (hand == "right") hand = "R";
    else hand = "L";
    vector<pair<int, int> > v;
    v.resize(13);
    v[0] = make_pair(3,1);
    int i=0,j=-1;
    for(int k=1;k<=12;k++){
        j++;
        if (j==3){
            j=0;
            i++;
        }
        if (k==11) continue;
        v[k]= make_pair(i,j);
    }
    pair<int, int> l,r;
    l = v[10];
    r = v[12];
    for(int i=0;i<numbers.size();i++){
        if (numbers[i]%3 ==2 || numbers[i]==0){
            int distl,distr;
            distl = abs(l.first - v[numbers[i]].first)+abs(l.second - v[numbers[i]].second);
            distr = abs(r.first - v[numbers[i]].first)+abs(r.second - v[numbers[i]].second);
            if (distl < distr){ //왼손이 더 가까움
                answer+='L';
                l = v[numbers[i]];
            } else if  (distr < distl){
                answer+='R';
                r = v[numbers[i]];
            } else { //거리 같음
                answer+=hand;
                if (hand == "R") r = v[numbers[i]];
                else l = v[numbers[i]];
            }
        }else if (numbers[i]%3==1){ //왼손사용
            answer+='L';
            l = v[numbers[i]];
        }else if (numbers[i]%3==0){ //오른손사용
            answer+='R';
            r = v[numbers[i]];
        }
    }
    return answer;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함