본문 바로가기
Programming Solve/프로그래머스

프로그래머스 - 키패드 누르기 / C++

by msm1029 2021. 10. 17.
반응형

문제 링크 : 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

 

문제 풀이 

단순 구현 문제이다. 2차원 배열에서 왼손의 현재 위치를 pair<int, int> curL으로 선언하고 오른손의 위치를 curR로 선언한다.

입력할 숫자가 1, 4, 7이라면 무조건 왼손을 써야하므로 "L"을 추가해주고 현재 왼손의 위치를 바꿔준다.

마찬가지로 3, 6, 9라면 "R"을 추가해주고 현재 오른손의 위치를 바꿔준다.

숫자가 2, 5, 8, 0이라면 거리를 계산해야하므로 2차원 배열에서 거리를 구하는 compute 함수를 만들어준다.

만약 현재 위치로부터 왼손, 오른손의 거리가 같다면 왼손잡이인지 오른손잡이인지에 따라 결정하고

오른손이 더 가깝다면 "R"추가 및 현재 오른손 위치 변경, 왼손이 더 가깝다면 "L"추가 및 왼손 위치를 변경

 

소스 코드

#include <bits/stdc++.h>
using namespace std;

int compute(pair<int, int> a, pair<int, int> b){
    return abs(a.first - b.first) + abs(a.second - b.second);
}

string solution(vector<int> numbers, string hand) {
    string answer = "";
    pair<int, int> curL, curR;
    curL = make_pair(3, 0);
    curR = make_pair(3, 2);
    
    for(int i=0; i<numbers.size(); i++){
        if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
            answer += "L";
            if(numbers[i] == 1){
                curL = make_pair(0, 0);
            }
            else if(numbers[i] == 4){
                curL = make_pair(1, 0);
            }
            else{
                curL = make_pair(2, 0);
            }
        } //무조건 왼손을 사용하는 경우
        else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
            answer += "R";
            if(numbers[i] == 3){
                curR = make_pair(0, 2);
            }
            else if(numbers[i] == 6){
                curR = make_pair(1, 2);
            }
            else{
                curR = make_pair(2, 2);
            }
        }//오른손을 사용하는 경우
        else{
            if(numbers[i] == 2){
                pair<int, int> tmp = make_pair(0, 1);
                if(compute(curL, tmp) == compute(curR, tmp)){
                    if(hand == "left"){
                        answer += "L";
                        curL = tmp;
                    }
                    else{
                        answer += "R";
                        curR = tmp;
                    }//왼손 오른손 거리가 똑같다면 왼손잡이인지 오른손잡이인지에 따라 결정
                }
                else if(compute(curL, tmp) > compute(curR, tmp)){
                        answer += "R";
                        curR = tmp;
                }//오른손이 더 가까운 경우
                else{
                    answer += "L";
                    curL = tmp;
                }//왼손이 더 가까운 경우
            }
            else if(numbers[i] == 5){
                pair<int, int> tmp = make_pair(1, 1);
                if(compute(curL, tmp) == compute(curR, tmp)){
                    if(hand == "left"){
                        answer += "L";
                        curL = tmp;
                    }
                    else{
                        answer += "R";
                        curR = tmp;
                    }
                }
                else if(compute(curL, tmp) > compute(curR, tmp)){
                        answer += "R";
                        curR = tmp;
                }
                else{
                    answer += "L";
                    curL = tmp;
                }
            }
            else if(numbers[i] == 8){
                pair<int, int> tmp = make_pair(2, 1);
                if(compute(curL, tmp) == compute(curR, tmp)){
                    if(hand == "left"){
                        answer += "L";
                        curL = tmp;
                    }
                    else{
                        answer += "R";
                        curR = tmp;
                    }
                }
                else if(compute(curL, tmp) > compute(curR, tmp)){
                        answer += "R";
                        curR = tmp;
                }
                else{
                    answer += "L";
                    curL = tmp;
                }
            }
            else{
                pair<int, int> tmp = make_pair(3, 1);
                if(compute(curL, tmp) == compute(curR, tmp)){
                    if(hand == "left"){
                        answer += "L";
                        curL = tmp;
                    }
                    else{
                        answer += "R";
                        curR = tmp;
                    }
                }
                else if(compute(curL, tmp) > compute(curR, tmp)){
                        answer += "R";
                        curR = tmp;
                }
                else{
                    answer += "L";
                    curL = tmp;
                }
            }
        }
    }
    
    return answer;
}

 

반응형