Kiki Devlog

[프로그래머스][Lv 1]카카오 인턴 키패드 누르기(2020 카카오 인턴십,pair 쓰기) 본문

Coding Test/프로그래머스

[프로그래머스][Lv 1]카카오 인턴 키패드 누르기(2020 카카오 인턴십,pair 쓰기)

kimkiki 2022. 8. 15. 01:12
728x90

오랜만에 코딩문제를 풀어야겠다 싶었다. 인턴한다고 너무 공부 안했다. Lv1이라해서 얕봤다가 은근 시간 오래걸렸다.

 

풀이법

숫자패드를 이차원 배열로 보고 손가락의 위치를 배열로 저장해서 다음번에 누를 숫자(이것도 이차원 배열로 표현)와의 거리(손가락과 숫자가 이차원 배열에서 떨어진 칸 수)를 계산.

 

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

using namespace std;

string solution(vector<int> numbers, string hand) {
    string answer = "";
    pair<int,int> curLPos = make_pair(3,0);
    pair<int,int> curRPos =  make_pair(3,2);
            
    for(auto num : numbers){
        if (num == 0) num = 11; // 원래 자리에 있어야 할 숫자로 계산 편의를 위해 바꿈 
        
        if(num == 1 || num == 4 || num == 7 ){
            answer += "L";
            curLPos =  make_pair((num-1)/3,0);
        }
        else if(num == 3 || num == 6 || num == 9 ){
            answer += "R";
            curRPos = make_pair((num-1)/3,2);
        } 
        else{ //가운데 줄 누름
            pair<int,int> numPos = make_pair((num-1)/3,(num-1)%3);
            int LDiff = abs(curLPos.first-numPos.first) + abs(curLPos.second-numPos.second);
            int RDiff = abs(curRPos.first-numPos.first) + abs(curRPos.second-numPos.second);

            if(LDiff > RDiff){
                answer += "R";
                curRPos = make_pair((num-1)/3,1);
            }
            else if(LDiff < RDiff){
                answer += "L";
                curLPos = make_pair((num-1)/3,1);
            }
            else { // 양손과의 거리 같음
                if(hand == "right"){
                    answer += "R";
                    curRPos = make_pair((num-1)/3,1);
                }
                else{
                    answer += "L";
                    curLPos = make_pair((num-1)/3,1);
                }
            }    
        }
    }
    
    return answer;
}

 

 

Comments