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

 

 

하드코딩..

1 2 3

4 5 6

7 8 9

* 0 #

 

왼쪽, 오른쪽, 중앙값을 각 벡터에 넣어서 인덱스를 비교하는 것으로 거리 계산

** 왼손 혹은 오른손이 이미 2 5 8 0 위에 올라가 있을 때, 다시 2 5 8 0 을 누르기 위한 거리 계산을 빠뜨렸었음

 

 

int distance(int cur_pos, int num) {
	vector<int> vL = { 1, 4, 7, 10 };
	vector<int> vR = { 3, 6, 9, 12 };
	vector<int> vC = { 2, 5, 8, 0 };
	int index_pos, index_C;
	if (cur_pos == 1 || cur_pos == 4 || cur_pos == 7 || cur_pos == 10) {
		index_pos = find(vL.begin(), vL.end(), cur_pos) - vL.begin();
		index_C = find(vC.begin(), vC.end(), num) - vC.begin();
		return abs(index_C - index_pos);
	}
			
	else if (cur_pos == 3 || cur_pos == 6 || cur_pos == 9 || cur_pos == 12) {
		index_pos = find(vR.begin(), vR.end(), cur_pos) - vR.begin();
		index_C = find(vC.begin(), vC.end(), num) - vC.begin();
		return abs(index_C - index_pos);
	}
		
	else {
		index_pos = find(vC.begin(), vC.end(), cur_pos) - vC.begin();
		index_C = find(vC.begin(), vC.end(), num) - vC.begin();
		return abs(index_C - index_pos)-1;
	}
}

string solution(vector<int> numbers, string hand) {
	string answer = "";
	bool main_hand;
	int cur_pos_R = 12;
	int cur_pos_L = 10;

	if (hand == "right") 
		main_hand = true;
	else if (hand == "left")
		main_hand = false;

	cout << "main_hand: " << main_hand << endl;
	for (int i = 0; i < numbers.size(); i++) {
		cout << "numbers["<<i<< "]: " << numbers[i]<< endl;
		if (numbers[i] == 1 || numbers[i]==4 || numbers[i]==7) {
			cur_pos_L = numbers[i];
			answer.push_back('L');
		}
		else if (numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9) {
			cur_pos_R = numbers[i];
			answer.push_back('R');
		}
		else {
			int dis_R = distance(cur_pos_R, numbers[i]);
			int dis_L = distance(cur_pos_L, numbers[i]);

			if (dis_R < dis_L) {
				cur_pos_R = numbers[i];
				answer.push_back('R');
			}
			else if (dis_R > dis_L) {
				cur_pos_L = numbers[i];
				answer.push_back('L');
			}
			else {
				if (hand == "right") {
					cur_pos_R = numbers[i];
					answer.push_back('R');
				}
				else {
					cur_pos_L = numbers[i];
					answer.push_back('L');
				}
			}
		}
	}
	return answer;
}

+ Recent posts