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

Kim Yuhyeon·2024년 3월 21일
0

알고리즘 + 자료구조

목록 보기
159/161

문제

https://school.programmers.co.kr/learn/courses/30/lessons/67256

접근방법

  1. 넘버가 1,4,7이면 왼쪽 / 3,6,9면 오른쪽
  2. 아니면 왼쪽 현재 위치와 오른쪽 현재 위치 각각에서 거리를 구해서 작은 곳으로 가도록 한다.

왼쪽 현재 위치, 오른쪽 현재 위치를 각각 저장하였다.

그리고 각 키패드에서의 위치, 어느 손으로 누를 것인지 등이 필요해 클래스를 만들어 벡터에 넣었다.
0을 처음에 넣었어야 했는데 이를 놓쳐서 한 번 틀렸었다ㅎ

풀이

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

using namespace std;

class Keypad {
    public:
        int number; // 번호
        pair<int, int> pos;
        string hand;

    Keypad(char number, int x, int y) {
        this->number = number;
        pos = {y, x};
        if (number == 1 || number == 4 || number == 7)
            hand = 'L';
        else if (number == 3 || number == 6 || number == 9)
            hand = 'R';
        else
            hand = "";
    }

    int getDistance(pair<int, int> other) {
        return abs(pos.first - other.first) + abs(pos.second - other.second);
    }
};

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

    vector<Keypad> keypads;

    int x=0, y=0;

    Keypad zero(0, 1, 3);
    keypads.push_back(zero);
    for(int i=1; i<=9; i++) {
        Keypad k(i, x, y);
        keypads.push_back(k);

        x++;
        if (x % 3 == 0) {
            y++;
            x = 0;
        }
    }    

    // y, x
    pair<int, int> leftPos = {3, 0};
    pair<int, int> rightPos = {3, 2};

    for(int targetNumber : numbers) {   
        Keypad k = keypads[targetNumber];
        string currHand = k.hand;

        if (currHand == "") {
            int leftDiff = k.getDistance(leftPos);
            int rightDiff = k.getDistance(rightPos);

            if (leftDiff < rightDiff) {
                leftPos = k.pos;
                answer += "L";
            } else if (leftDiff > rightDiff) {
                rightPos = k.pos;
                answer += "R";
            } else {
                if (hand == "right") {
                    rightPos = k.pos;
                    answer += "R";
                } else {
                    leftPos = k.pos;
                    answer += "L";
                }
            }
        } else {
            answer += currHand;
            if (currHand == "L") leftPos = k.pos;
            else rightPos = k.pos;
        }


    }
    return answer;
}

정리

깔끔하게 짜려고 하다 보니 쉬운 레벨의 문제임에도 1시간 가량 소요했다.. 그래도 덜깔끔하지만
코테인 만큼 정답을 내는 데 집중하도록 하자.

0개의 댓글