본문 바로가기
Algorithm/programmers

2020 Kakao internship 67256 - 키패드 누르기(배열, 구현) c++ 풀이

by Ellery 2021. 9. 6.

 

-단순 구현이다. 각 버튼마다 좌표값을 구해서 배열에 저장한뒤 그 좌표값으로 손가락과의 거리를 계속 구하는 식으로 빠르게 구현했다. 

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

using namespace std;

// 147 왼쪽 369오른쪽 2580 가까운 손가락 or hand
string solution(vector<int> numbers, string hand) { // numbers 1000
    string answer = "";
    
    vector<pair<int,int>> fingerPos(2); // L, R 위치
    vector<pair<int, int>> board(13); // 번호별 좌표
    
    fingerPos[0] = {3,0}, fingerPos[1] = {3,2}; // *, #
    board[0] = {3, 1};
    for(int i = 1; i <= 9; ++i) {
        int r = ((i-1) / 3);
        int c = ((i-1) % 3);
        board[i] = {r, c};
    }
    
    for(int n: numbers) {
        if(n == 1 || n == 4 || n == 7) {
            answer += 'L';
            fingerPos[0] = board[n];
        } else if(n == 3 || n == 6 || n == 9) {
            answer += 'R';
            fingerPos[1] = board[n];
        }
        else { // 2,5,8,0
            auto& [tr, tc] = board[n]; // r,c
            auto& [r1, c1] = fingerPos[0];
            auto& [r2, c2] = fingerPos[1];
            int len1 = abs(tr - r1) + abs(tc - c1);
            int len2 = abs(tr - r2) + abs(tc - c2);
            
            if(len1 < len2) {
                answer += 'L';
                fingerPos[0] = board[n];
            } else if(len1 > len2) {
                answer += 'R';
                fingerPos[1] = board[n];
            } else { // 같은 경우
                if(hand == "left") {
                    answer += 'L';
                    fingerPos[0] =  board[n];
                } else {
                    answer += 'R';
                    fingerPos[1] = board[n];
                }
            }
        }
    }
    
    return answer;
}

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