본문 바로가기
  • 주니어 개발자의
    RESTful 성장기
Algorithm/Programmers

[2020 카카오 인턴십] 키패드 누르기

by 돌건 2021. 3. 17.
 

코딩테스트 연습 - 키패드 누르기

[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

  • 분석

단순한 시뮬레이션 문제였습니다. 주의해야할 부분은 왼손과 오른손의 위치를 갱신해주어야 하는 점입니다. 거리 구하기를 편하게 하기 위해 pair<int, int> 타입의 pos 배열을 선언해 키패드와 동일한 구조를 만들어 사용했다.

 

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

using namespace std;

pair<int, int> pos[10] = {{4, 2}
                     ,{1, 1}, {1, 2}, {1, 3}
                     ,{2, 1}, {2, 2}, {2, 3}
                     ,{3, 1}, {3, 2}, {3, 3}};

string solution(vector<int> numbers, string hand) {
    string answer = "";
    pair<int, int> left = make_pair(4, 1);
    pair<int, int> right = make_pair(4, 3);
    
    for(int number: numbers) {
        // 1, 4, 7
        if(number % 3 == 1) {
            answer += "L";
            left = pos[number];
        }
        // 3, 6, 9
        else if(number != 0 && number % 3 == 0) {
            answer += "R";
            right = pos[number];
        }
        // 2, 5, 8, 0
        else {
            pair<int, int> cur = pos[number];
            
            int leftDiff = abs(left.first - cur.first) + abs(left.second - cur.second);
            int rightDiff = abs(right.first - cur.first) + abs(right.second - cur.second);
			
            // 왼손 거리가 더 짧은 경우
            if(leftDiff < rightDiff) {
                answer += "L";
                left = cur;
            }
            // 오른손 거리가 더 짧은 경우
            else if(rightDiff < leftDiff) {
                answer += "R";
                right = cur;
            }
            // 거리가 동일한 경우
            else {
            	// 왼손잡이인 경우
                if(hand == "left") {
                    answer += "L";
                    left = cur;
                }
                // 오른손잡이인 경우
                else {
                    answer += "R";
                    right = cur;
                }
            }
        }
    }
    
    return answer;
}

댓글