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

0

프로그래머스

목록 보기
6/128
post-thumbnail
post-custom-banner

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

  1. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  2. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  3. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
    (만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.)
  • 키패드 상의 두 숫자의 거리를 미리 계산해 2차원 벡터에 저장해두면, 거리를 알고 싶은 두 숫자를 인덱스로 사용하여 쉽게 저장된 거리를 접근해 사용할 수 있다.
    -> dist[숫자1][숫자2]

  • 왼손 엄지손가락은 왼쪽 열 *(임의의 숫자 13으로 치환),1, 4, 7과 가운데 열 2, 5, 8, 0에 위치해있을 수 있고,
    오른손 엄지손가락은 오른쪽 열 #(임의의 숫자 14로 치환),3, 6, 9와 가운데 열 2, 5, 8, 0에 위치해있을 수 있다.
    -> 모든 숫자 쌍이 아닌, 해당 숫자 쌍들에 대한 거리만 미리 계산하여 저장해두면 된다.

#include <string>
#include <vector>

using namespace std;

const int INF = 987654321;

string solution(vector<int> numbers, string hand) {

	string answer = "";

	//번호 간 거리 초기화 (* : 13, # : 14)
	vector<vector<int>> dist(15, vector<int>(15, INF));

	dist[1][2] = dist[3][2] = 1;
	dist[1][5] = dist[3][5] = 2;
	dist[1][8] = dist[3][8] = 3;
	dist[1][0] = dist[3][0] = 4;

	dist[4][2] = dist[6][2] = 2;
	dist[4][5] = dist[6][5] = 1;
	dist[4][8] = dist[6][8] = 2;
	dist[4][0] = dist[6][0] = 3;

	dist[7][2] = dist[9][2] = 3;
	dist[7][5] = dist[9][5] = 2;
	dist[7][8] = dist[9][8] = 1;
	dist[7][0] = dist[9][0] = 2;

	dist[13][2] = dist[14][2] = 4;
	dist[13][5] = dist[14][5] = 3;
	dist[13][8] = dist[14][8] = 2;
	dist[13][0] = dist[14][0] = 1;

	//center
	dist[2][2] = dist[5][5] = dist[8][8] = dist[0][0] = 0;
	dist[2][5] = dist[5][2] = dist[5][8] = dist[8][5] = dist[0][8] = dist[8][0] = 1;
	dist[2][8] = dist[8][2] = dist[5][0] = dist[0][5] = 2;
	dist[2][0] = dist[0][2] = 3;


	//현재 엄지 손가락의 위치
	int Lpos = 13; //*
	int Rpos = 14; //#

	for (int i = 0; i < numbers.size(); ++i) {
		int num = numbers[i];
		if (num == '*') num = 13;
		if (num == '#') num = 14;

		//flag = 0 왼손, flag = 1 오른손
		int flag;

		if (num == 1 || num == 4 || num == 7 || num == 13) flag = 0;
		else if (num == 3 || num == 6 || num == 9 || num == 14) flag = 1;

		else {
			if (dist[Lpos][num] < dist[Rpos][num]) flag = 0;
			else if (dist[Lpos][num] > dist[Rpos][num]) flag = 1;
			else if (hand == "left") flag = 0;
			else flag = 1;
		}

		//손가락 움직이기
		if (flag){
			Rpos = num;
			answer += "R";
		}
		else {
			Lpos = num;
			answer += "L";
		}
	}
	return answer;
}
profile
Be able to be vulnerable, in search of truth
post-custom-banner

0개의 댓글