본문 바로가기

개발/알고리즘 & 자료구조

[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

 

#include <string>
#include <vector>
#include <cmath>

using namespace std;

class Hand {
    public:
        int col,row;

        Hand(string hand) {
            if(hand=="left") {
                col=4;
                row=1;
            }
            else {
                col=4;
                row=3;
            }
        }
};

int getDist(int c1,int r1,int c2,int r2) {
    return abs(c1-c2)+abs(r1-r2);
}

string solution(vector<int> numbers, string hand) {
    string answer = "";

    Hand leftHand("left");
    Hand rightHand("right");

    for(int i=0;i<numbers.size();i++) {
        int lhDist,rhDist;
        int nCol,nRow;

        if(numbers[i]==1) {
            nCol=1;
            nRow=1;
        } else if(numbers[i]==2) {
            nCol=1;
            nRow=2;
        }else if(numbers[i]==3) {
            nCol=1;
            nRow=3;
        }else if(numbers[i]==4) {
            nCol=2;
            nRow=1;
        }else if(numbers[i]==5) {
            nCol=2;
            nRow=2;
        }else if(numbers[i]==6) {
            nCol=2;
            nRow=3;
        }else if(numbers[i]==7) {
            nCol=3;
            nRow=1;
        }else if(numbers[i]==8) {
            nCol=3;
            nRow=2;
        }else if(numbers[i]==9) {
            nCol=3;
            nRow=3;
        }else if(numbers[i]==0) {
            nCol=4;
            nRow=2;
        }

        if(numbers[i]==1||numbers[i]==4||numbers[i]==7) {
            leftHand.col=nCol;
            leftHand.row=nRow;
            answer+="L";
            continue;
        }

        if(numbers[i]==3||numbers[i]==6||numbers[i]==9) {
            rightHand.col=nCol;
            rightHand.row=nRow;
            answer+="R";
            continue;
        }


        lhDist=getDist(leftHand.col,leftHand.row,nCol,nRow);
        rhDist=getDist(rightHand.col,rightHand.row,nCol,nRow);

        if(lhDist<rhDist) {
            leftHand.col=nCol;
            leftHand.row=nRow;
            answer+="L";
            continue;
        }

        if(lhDist>rhDist) {
            rightHand.col=nCol;
            rightHand.row=nRow;
            answer+="R";
            continue;
        }

        if(lhDist==rhDist) {
            if(hand=="left") {
                leftHand.col=nCol;
                leftHand.row=nRow;
                answer+="L";
                continue;
            } else {
                rightHand.col=nCol;
                rightHand.row=nRow;
                answer+="R";
                continue;
            }
        }
    }

    return answer;
}

 

시뮬레이션 문제다.

모든 경우에 대해 처리해주니 운좋게 한번에 통과했다.

(한번에 통과할 때의 짜릿함은 익숙해지지 않는듯..)

 

이 문제에서 핵심은

왼쪽 엄지와 오른쪽 엄지의 위치라고 볼 수 있다.

 

각 엄지 손가락의 현재 위치를 갱신해가며

문제의 조건에 부합하는지 체크하는 방법을 선택했다.

 

두 버튼 간의 거리를 구할 때는

math 라이브러리에 있는 abs() 함수를 이용하여

절대값을 더하여 사용해서 편하게 풀 수 있었다.

반응형