본문 바로가기
문제 풀이/프로그래머스 (Programmers)

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

by 희조당 2021. 9. 13.
728x90

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


 문제 풀이

왼손과 오른손의 좌표와 누를 버튼까지의 거리를 저장하는 구조체를 선언한다.

발생하는 경우는 3가지이다.

1. 왼쪽(1, 4, 7)을 누르는 경우

2. 오른쪽(3, 6, 9)을 누르는 경우

3. 가운데(2, 5, 8, 0)를 누르는 경우

 

1번 경우는 왼손잡이, 오른손잡이 상관없이 왼손으로 누르면 된다.

2번 경우도 왼손잡이, 오른손잡이 상관없이 오른손으로 누르면 된다.

3번 경우는 거리를 비교한다.

더 짧은 거리를 비교해서 누르면 된다. 하지만 거리가 같다면 주로 쓰는 손으로 누른다.

 느낀 점

간단한 구현 문제였다. 중간에 0의 위치를 잘못 입력해서 오류가 계속 났다...

 코드

#include <string>
#include <vector>
#include <math.h>

using namespace std;

typedef struct {
    int x;
    int y;
    int dis;
}point;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    point left, right, num;
    int tmp;
    left.x = 0; left.y = 3;
    right.x = 2; right.y = 3;
    for (int i = 0; i < numbers.size();i++) {
        if (numbers[i] == 0) {
            num.x = 1; num.y = 3;
            tmp = 2;
        }
        else {
            num.x = (numbers[i] + 2) % 3;
            num.y = (numbers[i] - 1) / 3;
            tmp = numbers[i] % 3;
        }

        if (tmp == 1) {
            left.x = num.x; left.y = num.y;
            answer += "L";
        }
        else if (tmp == 0) {
            right.x = num.x; right.y = num.y;
            answer += "R";
        }
        else {
            left.dis = abs(left.x - num.x) + abs(left.y - num.y);
            right.dis = abs(right.x - num.x) + abs(right.y - num.y);
            if (left.dis > right.dis || (left.dis == right.dis && hand == "right")) {
                right.x = num.x; right.y = num.y;
                answer += "R";
            }
            else if (left.dis < right.dis || (left.dis == right.dis && hand == "left")) {
                left.x = num.x; left.y = num.y;
                answer += "L";
            }
        }
    }
    return answer;
}

댓글