💭 Problem Solving

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

0=2. 2024. 5. 27. 01:45

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

💡 규칙

  • 1, 4, 7: 왼손 
  • 3, 6, 9: 오른손
  • 2, 5, 8, 0: 거리 계산(더 가까운 쪽)

💡 거리 계산

  1. 키 변환: *: 11 / 0: 12 / #: 13
                                                      1   2   3            1     2     3
                                                      4   5   6    →     4     5     6
                                                      7   8   9             7     8     9
                                                     *    0    #            11   12   13
  2. 한 칸 이동 시 좌우 이동: -1, +1 / 상하 이동: -3, +3 로 계산 가능
    좌우: (눌러야 하는 키 값과 현재 키의 차이) % 3
    상하: (눌러야 하는 키 값과 현재 키의 차이) / 3

    (ex) 2 → 6
           차이: 4 = 우 1칸, 하 1칸 (1 + 3)
  3. 왼손과의 거리 & 오른손과의 거리 비교 후 더 작은 값에 따라 손 결정
    거리가 같을 경우 오른손잡이, 왼손잡이에 따라 결정

코드

#include <iostream>
#include <vector>

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    int l_hand = 10, r_hand = 12;   // 왼손: *, 오른손: # 에서 시작

    for (int key: numbers) {
        if (key == 1 || key == 4 || key == 7) { // 왼손
            l_hand = key;
            answer += 'L';
        } else if (key == 3 || key == 6 || key == 9) {    // 오른손
            r_hand = key;
            answer += 'R';
        } else {  // 거리 계산
            if (key == 0) { // 0은 11로 계산
                key = 11;
            }

            // 상하                   좌우
            int l_distance = abs(key - l_hand) / 3 + abs(key - l_hand) % 3;
            int r_distance = abs(key - r_hand) / 3 + abs(key - r_hand) % 3;

            if (l_distance < r_distance) {    // 왼손이 더 가까움
                l_hand = key;
                answer += 'L';
            } else if (l_distance > r_distance) {   // 오른손이 더 가까움
                r_hand = key;
                answer += 'R';
            } else {  // 왼손, 오른손 거리 같음
                if (hand == "right") {
                    r_hand = key;
                    answer += 'R';
                } else {
                    l_hand = key;
                    answer += 'L';
                }
            }
        }
    }

    return answer;
}