Coding Test/programmers

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

owls 2022. 8. 18. 20:46
728x90

문제 설명

1 2 3
4 5 6
7 8 9
*(10) 0(11) #(12)

1, 4, 7, *(10) 은 왼손으로

3, 6, 9, #(12) 는 오른손으로

2, 5, 8, 0(11) 은 가까이 있는 손으로 누른다.

 

2, 5, 8, 0(11) 를 어떤 손으로 눌러야 하는지 계산하는게 핵심인 문제이다.

 

제한 사항

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

입출력 예

numbers hand result
[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"

풀이

현재 left, right 의 위치에서

2, 5, 8, 0(11) key까지의 거리 계산에 유의한다!

string solution(vector<int> numbers, string hand) {
	string answer = "";

	int left = 10;
	int right = 12;

	for (int i = 0; i < numbers.size(); i++)
	{
		if (numbers[i] == 0)
			numbers[i] = 11;

		int key = numbers[i];
		if (key % 3 == 0)
		{
			answer += "R";
			right = key;
		}
		else if (key % 3 == 1)
		{
			answer += "L";
			left = key;
		}
		else
		{
			int left_dist = abs(left - key);
			int right_dist = abs(right - key);

 			int left_count = 0, right_count = 0;

			left_count = left_dist / 3 + left_dist % 3;
			right_count = right_dist / 3 + right_dist % 3;

			if (left_count < right_count)
			{
				left = key;
				answer += "L";
			}
			else if (left_count > right_count)
			{
				right = key;
				answer += "R";
			}
			else
			{
				if (hand.compare("left") == 0)
				{
					left = key;
					answer += "L";
				}
				else
				{
					right = key;
					answer += "R";
				}
			}
		}
	}

	return answer;
}

 

728x90